Robolectric 等待网络响应

Robolectric wait for network response

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

我们可能可以使用 CountDownLatch; I use OkHttp3IdlingResource 在 Espresso 的网络调用期间等待。 Robolectric有没有类似的东西?

是否可以像使用 espresso 一样使用 roboelectric 将实际网络数据填充到 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());
    }
}

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