java - JUnit/Mockito - 如何捕获参数字段的变化?

标签 java android unit-testing junit mockito

我有一个 ObservableBoolean,它是一个非常简单的数据容器,包装了一个原始 boolean 值。我想使用 JUnit/Mockito 来验证原始 boolean 值是否更改为 true 后跟 false。我正在像这样设置一个模拟 OnPropertyChangedCallback:

Observable.OnPropertyChangedCallback loadingCallback = mock(Observable.OnPropertyChangedCallback.class);
viewModel.loading.addOnPropertyChangedCallback(loadingCallback);

然后我正在运行被测代码:

loading.set(true);
loading.set(false);

这些调用中的每一个都会触发 loadingCallback 上的 onPropertyChanged 方法,将相同 ObservableBoolean 实例作为参数传递。

我试过使用 ArgumentCaptor 和自定义 ArgumentMatcher。这两种方法都成功地表明 onPropertyChange 方法已被调用两次,但是,它们都没有保留 ObservableBoolean 中原始 boolean 值发生的历史记录。相反,我只能看到其上设置的最新值,这是错误的。

如何保留 ObservableBoolean 中原始 boolean 值发生的历史记录?同样,我只需要验证它是否设置为 true,然后是 false。

最佳答案

您可以创建一个 stub ,它实现Observable.OnPropertyChangedCallback 并记录调用,然后为这些记录的调用提供公共(public)访问器。然后,您的测试将在断言时对这些记录的调用使用公共(public)访问器。

例如:

    OnPropertyChangedCallbackStub loadingCallback = new OnPropertyChangedCallbackStub();
    viewModel.loading.addOnPropertyChangedCallback(loadingCallback);

    // invoke the code-under-test which, internally, invokes ...
    // loading.set(true);
    // loading.set(false);

    assertTrue(2, loadingCallback.recordedInvocations().size());
    assertTrue(loadingCallback.recordedInvocations().contains(true));
    assertTrue(loadingCallback.recordedInvocations().contains(false));

关于java - JUnit/Mockito - 如何捕获参数字段的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47274724/

相关文章:

java - 无法理解remove()函数

node.js - 将 Mocha 测试与源文件放在一起

c# - 使用反射为单元测试做复杂的对象断言是不好的做法吗?

android - 在 Compose 中,一旦 Coil 从 URL 加载图像,如何访问 drawable

java - Android 同一个方法调用了两次

c# - 为 Web API 单元测试指定 HttpRequestMessage 的内容

java - 如何在 JAX-RS 中实现 HTTP 方法的默认功能?

java - 循环java中的值之和

java - 是否有工具可以为 Eclipse 中的 Maven 项目提供动态代码覆盖率?

android - 使用附加库 (Assimp) 在 Qt 上构建 android 应用程序