GridView.getChildAt returns 使用 Robolectric 测试时为空

GridView.getChildAt returns null when testing with Robolectric

我正在尝试测试 GridView 以确保它使用 Robolectric 加载图像。 GridView.getChildAt(0) returns null 即使适配器中有数据。我知道这是因为 getChildAt() returns 基于屏幕上显示的内容。

有没有办法让这个测试在 Robolectric 中运行,或者我是否必须转移到设备上进行测试(例如使用 Espresso)?

@RunWith(RobolectricTestRunner.class)
@Config(manifest = "../../src/main/AndroidManifest.xml", emulateSdk = 18, reportSdk = 18)
public class ImageGridFragmentTest {

    private ImageGridFragment mImageGridFragment;

    @Before
    public void setup() {
        ShadowLog.stream = System.out;
        mImageGridFragment = new ImageGridFragment();
        startFragment(mImageGridFragment);
    }

    @Test
    public void testImageGridFragmentLoaded() throws Exception {
        assertNotNull(mImageGridFragment);
    }

    @Test
    public void shouldLoadImageToGrid() throws Exception {
        GridView gridView = (GridView) mImageGridFragment.getView().findViewById(R.id.gv_image_grid);
        Log.d("gridView.size", Integer.toString(gridView.getCount()));

        assertEquals(0, gridView.getFirstVisiblePosition());
        View itemView = (View) gridView.getChildAt(0);
        assertNotNull(itemView); // Test fails here

        ImageView imageView = (ImageView) itemView.findViewById(R.id.iv_loaded_image);
        ShadowDrawable shadowDrawable = Robolectric.shadowOf(imageView.getDrawable());
        assertEquals(R.drawable.sample_image, shadowDrawable.getCreatedFromResId());
    }
}

这不是对系统的彻底测试,但可能是可以完成的最佳测试。

@Test
public void shouldLoadImageToGrid() throws Exception {
    GridView gridView = (GridView) mImageGridFragment.getView().findViewById(R.id.gv_image_grid);

    ImageGridData data = (ImageGridData) gridView.getAdapter().getItem(0);
    assertEquals((long)R.drawable.sample_image, (long)data.getImageId());
}