首页 > 解决方案 > 参数匹配器的使用无效。如果此方法使用另一种私有方法,我该如何测试它?

问题描述

我有方法:

public void loadPlatformDependencies() {
    try {
        dependenciesRepository.deleteAll();
        dependenciesRepository.saveAll(pullLastDependencies());
        publisher.publishEvent(new LoadedDependenciesEvent());
    } catch (Exception e) {
        LOGGER.error("Failed to load dependencies", e);
    }
}

我尝试测试它:

   @Test
    public void testLoadPlatformDependencies() {
        ArgumentCaptor<Iterable<Dependency>> captor = ArgumentCaptor.forClass(Iterable.class);
        when(dependenciesRepository.saveAll(captor.capture())).thenReturn(any(Iterable.class));
        puller.loadPlatformDependencies();

        verify(dependenciesRepository,times(1)).deleteAll();
        verify(dependenciesRepository, times(1)).saveAll(any(Iterable.class));
        verify(publisher,times(1)).publishEvent(any());

   }

但是有一个问题,该方法 pullLastDependencies() 现在工作不正确。我有一个错误:

Invalid use of argument matchers!
0 matchers expectd, 1 recorded:

方法 pullLastDependencies() 返回列表。我可以在没有正确工作的方法 pullLastDependencies() 的情况下测试此方法吗?或者也许我应该以另一种方式测试这种方法?

标签: javaunit-testingmockito

解决方案


您正在使用捕获器when()而不是verify(). 而且您正在从您的模拟方法返回 any()(只是null),而不是返回您希望此模拟返回的内容。如果您因为不使用它而不关心它返回的内容,则返回一个空的可迭代对象。

它应该是

when(dependenciesRepository.saveAll(any()).thenReturn(Collections.emptyList());
puller.loadPlatformDependencies();

verify(dependenciesRepository).deleteAll();
verify(dependenciesRepository).saveAll(captor.capture());

推荐阅读