我有一个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。
答案 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())
}
}
}