java - 在单元测试中模拟 RxJava 的 Activity 生命周期

标签 java android unit-testing rx-java

目前正在使用 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());
}

(请不要介意对象的命名,随便取一些名字来反射(reflect)它需要做什么。)

我正在运行单元测试来测试相关的代码 fragment 。不过,这些 fragment 不包含 .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 调度器,所以这不是问题)

谢谢!

最佳答案

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

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

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

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

希望对你有帮助(:

关于java - 在单元测试中模拟 RxJava 的 Activity 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40000251/

相关文章:

java - 如何消除这个错误->Json解析错误: Value success at response of type java. lang.String无法转换为JSONArray

android LinearLayout 性能

android - 在现有项目React-Native中添加现有原生项目Android

python - unittest.main() 如何选择测试用例调用的顺序

Xcode:如何测试主包 .plist 文件内容?

java - 当我发送休息请求时,为什么我收到 http 错误代码 500

java - 在 tomcat 实例之间共享 session (不使用粘性 session )

java - 警告 : JAVA_HOME environment variable is not set

java - ListView 滚动时覆盖 EditText

c++ - cppUnit 在启动每个单元测试时是否使用 fork()?