无效使用参数匹配器。如果此方法使用其他私有方法,该如何测试?

时间:2019-12-21 12:54:27

标签: java unit-testing mockito

我有方法:

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()返回List。 如果没有正确工作的方法pullLastDependencies(),是否可以测试此方法?还是我应该以另一种方式测试此方法?

2 个答案:

答案 0 :(得分:2)

您正在when()中使用捕获器,而不是verify()。 然后,您从模拟方法中返回 any()(仅仅是null),而不是返回希望此模拟返回的内容。如果您不使用它而不在乎它返回什么,则返回一个空的Iterable。

应该是

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

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

答案 1 :(得分:-1)

我认为这里的问题是您正在使用匹配器作为返回值

when(dependenciesRepository.saveAll(captor.capture())).thenReturn(any(Iterable.class));

您应该使用匹配器来“匹配”方法参数,并返回另一个结构,如下所示:

when(dependenciesRepository.saveAll(anyIterable())).thenReturn(Collections.emptyList())

只要您的pullLastDependencies()方法没有其他依赖关系,它就应该起作用。

编辑: 看来您的pullLastDependencies()还具有其他一些依赖关系,因此您需要模拟对其的调用。您可以通过在测试过程中更改方法的可见性来实现此目的,因此可以对其进行模拟,但请记住,这不是很好的实践。

//making private method accessible
Method method = service.getClass().getDeclaredMethod("pullLastDependencies",params);
method .setAccessible(true); 
when(pullLastDependencies()).thenReturn(Collections.emptyList())