Android RecyclerView适配器项目计数在单元测试时返回0

dev*_*oid 9 android unit-testing android-adapter android-junit

我正在尝试使用AndroidJunit4测试RecyclerView,这是我的测试代码:

@Rule
    public ActivityTestRule<ProductListActivity> rule  = new  ActivityTestRule<>(ProductListActivity.class);

............................
..........................

@Test
    public void ensureDataIsLoadingOnSuccess() throws Exception {
        ProductListActivity activity = rule.getActivity();
        ...........................
        ............

        activity.runOnUiThread(new Runnable() {
        public void run() {
            activity.displayProducts(asList(product1, product2), 0);
        }
    });

        assertEquals(2, mAdapter.getItemCount());
        assertThat(((ProductAdapter) mAdapter).getItemAtPosition(0),sameInstance(product1));
        assertThat(((ProductAdapter) mAdapter).getItemAtPosition(1),sameInstance(product2));


    }
Run Code Online (Sandbox Code Playgroud)

这是我在Activity中的displayProducts()代码:

@Override
    public void displayProducts(List<Product> products, Integer pageNo) {
        progressBar.setVisibility(View.GONE);
        if (pageNo == 0 && products.size() == 0) {
            noProductTextView.setVisibility(View.VISIBLE);
        } else {
            mProductAdapter.addProduct(products);
            noProductTextView.setVisibility(View.GONE);
            productListView.setVisibility(View.VISIBLE);
        }
    }
Run Code Online (Sandbox Code Playgroud)

它给出的错误如下:

junit.framework.AssertionFailedError: expected:<2> but was:<0>
at junit.framework.Assert.fail(Assert.java:50)
at junit.framework.Assert.failNotEquals(Assert.java:287)
at junit.framework.Assert.assertEquals(Assert.java:67)
at junit.framework.Assert.assertEquals(Assert.java:199)
at junit.framework.Assert.assertEquals(Assert.java:205)
at com.kaushik.myredmart.ui.ProductListActivityTest.ensureDataIsLoadingOnSuccess(ProductListActivityTest.java:94)
Run Code Online (Sandbox Code Playgroud)

请帮助我的代码中的问题是什么?

pul*_*ion -1

我在这里看到一个问题,您在主/UI 线程能够更新列表之前询问列表大小。因此,您必须在当前线程中等待,直到活动完成更新主线程上的列表。

你可以做,

Thread.sleep(500);
Run Code Online (Sandbox Code Playgroud)

在Test类中等待,测试Activity中的列表设置行为,你会发现断言是有效的。

由于主线程无限运行直到应用程序运行,因此您必须实现 Activity 提供的回调接口,以便在填充列表完成时收到通知。