【发布时间】:2019-04-04 20:48:28
【问题描述】:
我编写了使用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() 是否有别名,所以我可以将它与参数捕获器一起使用,并且该名称更适合 //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();
}
});
}
【问题讨论】:
-
为什么放在 //when 部分开头?它属于 //then 部分。如果没有调用预期的方法,验证语句将无法通过测试。然后,如果您想对调用中使用的参数进行额外验证,则使用参数捕获器。两者都在验证事物。
-
我正在检查是否调用了
showMissingItem(),我没有检查是否调用了getItem。参数 captor 仅用于调用onDataNotAvailable()。我的测试应该是什么样子?
标签: unit-testing testing mockito tdd bdd