我编写了使用BBDMockitoArgument 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()包含/等于您期望的值)。

09-25 22:55