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部分中的预期一样