【问题标题】:Mocking Activity Lifecycle for RxJava in unit test在单元测试中模拟 RxJava 的活动生命周期
【发布时间】:2017-02-21 08:28:08
【问题描述】:

目前正在使用 RxJava 开发一个 Android 应用程序。

我得到以下代码:

public Observable<Response<DTO>> getDTO(final BaseActivity activity, final long workorderId) {
    return dtoService.getDTO(DTOId)
            .subscribeOn(Schedulers.io())
            .compose(activity.bindUntilEvent(ActivityEvent.PAUSE))
            .observeOn(AndroidSchedulers.mainThread());
}

(请不要介意对象的命名,随便放一些名称以反映它需要做什么。)

我已经运行单元测试来测试相关的代码片段。尽管如此,这些部分不包含.compose() 方法。 现在我尝试了以下方法:

@Mock
private BaseActivity baseActivity;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
}

private BaseActivity baseActivity;

@Before
public void setup() {
    baseActivity = Mock(BaseActivity.class);
}

这两种情况都给了我一个空指针:lifecycle == null(如果我调试它就是这样)。

我如何以任何其他方式模拟或测试它? (我也不完全理解 compose() 方法。但我似乎找不到与此代码相关的任何资源)

(我提供了 Android 和 RxJava 调度程序,所以这不是问题)

谢谢!

【问题讨论】:

  • 您是否考虑过监视实际活动?如果您正在进行单元测试活动,我也会建议使用 robolectric。单元测试本身并不是为此而设计的。
  • 我对这个示例项目进行了不同类型的单元测试,希望对您有所帮助:github.com/mmirhoseini/fyber_mobile_offers
  • 但我不想测试我的活动。我只想知道该方法是否返回一个带有正确 DTO 响应的 observable。这就是为什么我要模拟这个活动,因为它与此无关。或者我只是不明白 compose() 方法?

标签: java android unit-testing rx-java


【解决方案1】:

好的,所以。让我们从.compose 方法开始。它的作用 - 将一些转换器功能应用于您的 Observable,您可以将其理解为 “组合可观察方法的自定义序列(如 mapflatMap 等)”。 IE。您可以使用它来组合.subscribeOn.observeOn 方法(more here)。由于您使用的是 RxLifecycle,您可以直接转到源代码并查看,what it does

如果你想在测试中使用活动的生命周期,你必须使用Robolectric。它将让您完全控制创建活动和管理它的生命周期。 这将有助于 NPE。您只需设置它并编写:

    ActivityController controller = Robolectric.buildActivity(BaseActivity.class).create().start().resume();
Activity activity = controller.get();

// Not paused yet
activityController.pause();
// Pause happened! Do something!

希望对你有帮助(:

【讨论】:

  • 澄清了很多。谢谢!如果我正确理解我的代码(它是由其他人编写的),如果活动暂停,呼叫将终止?否则它会继续吗?但问题是,我实际上不想对我的活动做任何事情。有没有办法在没有 RoboElectric 的情况下模拟方法或活动?我只是想知道我是否得到一个带有 Response. 的 observable 返回
  • 活动暂停时,是的,它会发出 onCompleted() 并且调用将终止(根据文档)。
  • 关于模拟 - 你可以尝试使用Mockito.when(activity.getLifecycle()).thenReturn(ActivityEvent.PAUSE) 或类似的东西(这是伪代码,不会工作,我只是想展示方法)
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 2020-09-06
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2015-01-03
相关资源
最近更新 更多