【问题标题】:BDD Mockito - alias for verify(...) when using argument captor?BDD Mockito - 使用参数捕获器时验证(...)的别名?
【发布时间】:2019-04-04 20:48:28
【问题描述】:

我编写了使用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() 是否有别名,所以我可以将它与参数捕获器一起使用,并且该名称更适合 //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


【解决方案1】:

verify(...) 是一个断言,它用于检查方法是否被调用以及调用了多少次 - 它属于 //then 部分

我看到您也在使用 argumentCaptor,但没有用它检查任何内容,正确的过程是断言捕获的值(getItemCallbackArgumentCapture.getValue() 包含/等于您期望的值)。

【讨论】:

  • 但我必须调用onDataNotAvailable()?有没有比使用参数捕获器更好的解决方案?
  • 从参数捕获器调用它实际上并没有帮助,因为它不会影响您的测试输出 - 除了您正在尝试的之外,您不应该尝试调用任何方法代码去测试。你想通过调用 onDataNotAvailable() 来达到什么目的?
  • 我必须调用onDataNotAvailable(),因为我正在测试此方法中调用的内容。请检查我的编辑。如果您知道更好的解决方案,然后从 ArgumentCaptor 调用 onDataNotAvailable(),请告诉我。
  • 我明白了,如果您在测试中调用load(),那么无论如何都应该调用onDataNotAvailable(),对吗?基本上,您想要设置您的 itemDetailPresenter,以便在调用 load() 时依次调用 onDataNotAvailable() 而无需您手动调用它(因为那时您并没有真正测试行为并且您的 then(itemDetailView).should().showMissingItem(); 将始终失败)。这里的想法是设置(在 when 部分期间)测试用例,这样当您调用被测方法时,它的行为与您在 then 部分中的预期相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2013-07-07
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多