我编写了使用BBDMockito
和Argument Captor
的测试。 Argument Captor仅用于捕获回调并调用onDataNotAvailable()
,而不用于验证。
@Test
public void loadNoItemFromRepository_showsMissingItem() {
//given
itemDetailPresenter = new ItemDetailPresenter(UNCHECKED_ITEM.getId(), itemsRepository, itemDetailView);
given(itemDetailView.isActive()).willReturn(true);
//when
itemDetailPresenter.load();
verify(itemsRepository).getItem(eq(UNCHECKED_ITEM.getId()), getItemCallbackArgumentCaptor.capture());
getItemCallbackArgumentCaptor.getValue().onDataNotAvailable();
//then
then(itemDetailView).should().showMissingItem();
}
放在
Verify
部分中的//when
令人困惑,因为名称建议将其放置在验证部分(//then
)中。 verify()
是否有别名,因此我可以将其与参数captor一起使用,并且该名称更适合//when
?编辑:
我要测试的代码是是否调用了
itemDetailView.showMissingItem()
。public void load() {
(...)
itemsRepository.getItem(itemId, new ItemsDataSource.GetItemCallback() {
@Override
public void onItemLoaded(Item item) {
(...)
if (nonNull(item))
showItem(item);
else
itemDetailView.showMissingItem();
}
@Override
public void onDataNotAvailable() {
(...)
itemDetailView.showMissingItem();
}
});
}
最佳答案
verify(...)
是一个断言,用于检查某个方法是否被调用以及未调用多少次,它属于//then
部分
我看到您也在使用argumentsCaptor,但未对其进行任何检查,因此必须进行适当的过程来断言所捕获的值(getItemCallbackArgumentCapture.getValue()
包含/等于您期望的值)。