Unit testing BDD Mockito-使用参数captor时验证(…)的别名?
我编写了使用Unit testing BDD Mockito-使用参数captor时验证(…)的别名?,unit-testing,testing,mockito,tdd,bdd,Unit Testing,Testing,Mockito,Tdd,Bdd,我编写了使用BBDMockito和参数Captor的测试。参数Captor仅用于捕获回调并调用onDataNotAvailable(),不用于验证 @Test public void loadNoItemFromRepository_showsMissingItem() { //given itemDetailPresenter = new ItemDetailPresenter(UNCHECKED_ITEM.getId(), itemsRepository, itemDetai
BBDMockito
和参数Captor
的测试。参数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
放在//当
部分令人困惑时,因为名称表明它应该放在Verify部分(//然后
)。是否有verify()
的别名,以便我可以将其与参数captor一起使用,并且该名称将更适合//当
时使用
编辑:
我要测试的代码是,是否调用了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
部分
我看到您也在使用argumentCaptor,但没有对其进行任何检查,正确的过程是断言捕获的值(
getItemCallbackArgumentCapture.getValue()
包含/等于您期望的值)。为什么要将其放在//开始时的部分?它属于//then部分。如果未调用预期的方法,则verify语句将使测试失败。然后,如果您想对调用中使用的参数进行额外验证,将使用参数captor。两者都在验证。我正在检查是否调用了showMissingItem()
,而不是检查是否调用了getItem
。参数captor仅用于调用onDataNotAvailable()
。我的测试应该是什么样子?但是我必须调用onDataNotAvailable()
?有比使用参数捕获器更好的解决方案吗?从参数捕获器调用它实际上不会有帮助,因为它不会影响测试的输出-除了您要测试的内容之外,您不应该尝试调用任何方法代码。通过调用onDataNotAvailable(),您试图实现什么?我必须调用onDataNotAvailable()
,因为我正在测试此方法中调用的内容。请检查我的编辑。如果您知道比从ArgumentCaptor调用onDataNotAvailable()
更好的解决方案,请让我知道。我知道,如果您在测试中调用load()
,应该调用onDataNotAvailable()
,对吗?基本上,您希望设置您的itemDetailPresenter
,以便在调用load()
时,它会依次调用onDataNotAvailable()
,而无需手动调用它(因为此时您并不是在真正测试行为,您的then(itemDetailView).showMissingItem();
将始终失败)。这里的想法是(在when部分中)以这样一种方式设置测试用例,即当您调用测试中的方法时,它的行为与您在then部分中的预期一样