Robolectric等待网络响应

时间:2017-06-27 08:37:34

标签: android robolectric

我正在使用Robolectric来测试我使用retrofit和rxjava的应用程序。每次活动开始时,应用程序内部都会从服务器动态填充回收站视图项。填充recylerview后,我想单击一个项目并测试下一个活动是否已启动。在测试类内部,Robolectric不会等待响应,所以我必须放置Thread.sleep。它等待一段固定的时间,并在第RecyclerView.ViewHolder holder = shadowAdapter.getViewHolder(0);行提取一个项目但是我不想在我的测试用例中放置一个随机的线程休眠时间。

我们可以使用CountDownLatch;我在Espresso的网络通话期间使用OkHttp3IdlingResource等待。 Robolectric有什么类似的东西吗?

使用roboelectric就像espresso一样,使用实际网络数据填充recyclerview是否可以?

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, shadows = {ShadowRecyclerViewAdapter.class})
 public class HomeActivityTest {

    private HomeActivity activity;
    private HomeFragment fragment;

    private ShadowRecyclerViewAdapter shadowAdapter;

    @Before
    public void setUp() throws Exception {
        activity = Robolectric.buildActivity(HomeActivity.class)
                .create()
                .postCreate(null)
                .start()
                .resume()
                .visible()
                .get();
        assertNotNull(activity);

        fragment = (HomeFragment) activity.getSupportFragmentManager().findFragmentByTag(HomeActivity.TAG_HOME_FRAGMENT);
        assertNotNull(fragment);

        ShadowLog.stream = System.out;

        Robolectric.flushBackgroundThreadScheduler();

        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
    }

    @Test
    public void itemClickShouldStartNewActivity() throws Exception
    {

        RecyclerView recyclerView = ((RecyclerView) fragment.getActivity().findViewById(R.id.rv));
        shadowAdapter = customShadowOf(recyclerView.getAdapter());

        Thread.sleep(3000);

        shadowAdapter.notifyDataSetChanged();

        RecyclerView.ViewHolder holder = shadowAdapter.getViewHolder(0);
        holder.itemView.performClick();
  //        Intent intent = Shadows.shadowOf(activity).peekNextStartedActivity();
  //        assertEquals(NextActivity.class.getCanonicalName(), intent.getComponent().getClassName());
    }
}

1 个答案:

答案 0 :(得分:0)

Robolectric用于单元测试。使用真实的网络通话是一种不良做法。您应该模拟网络堆栈(例如使用Mockito)