我有方法:
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(),是否可以测试此方法?还是我应该以另一种方式测试此方法?
答案 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())