JUnit / Mockito - 如何捕获参数字段中的更改?

时间:2017-11-13 22:38:00

标签: java android unit-testing junit mockito

我有一个ObservableBoolean,它是一个包含原始布尔值的非常简单的数据容器。我想使用JUnit / Mockito来验证原始布尔值是否变为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中原始布尔值发生的历史。相反,我只能看到最近设置的值,这是错误的。

如何维护ObservableBoolean中原始布尔值发生的历史?同样,我只需要验证它是否设置为true,然后是false。

2 个答案:

答案 0 :(得分:2)

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

例如:

    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));

答案 1 :(得分:0)

我在他的回答中张贴了@glytching类的实现:

val callback = BooleanObservableCallback()
        viewModel.isLoading.addOnPropertyChangedCallback(callback)

viewModel.onLoginButtonClicked()

assertThat(callback.recordedInvocations, hasSize(2))
        assertThat(callback.recordedInvocations[0], `is`(true))
        assertThat(callback.recordedInvocations[1], `is`(false))


class BooleanObservableCallback : Observable.OnPropertyChangedCallback() {

    private val _recordedInvocations = mutableListOf<Boolean>()

    val recordedInvocations: List<Boolean>
        get() = _recordedInvocations.toList()

    override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
        if (sender is ObservableBoolean) {
            _recordedInvocations.add(sender.get())
        }
    }
}