参数匹配器的使用无效。如果此方法使用另一个私有方法,我该如何测试它?

pet*_*ndr 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试测试它:

   @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());

   }
Run Code Online (Sandbox Code Playgroud)

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

Invalid use of argument matchers!
0 matchers expectd, 1 recorded:
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 2

您正在使用 captorwhen()而不是verify()。并且您正在从模拟方法返回 any()(这只是null),而不是返回您希望该模拟返回的内容。如果你不关心它返回什么,因为你不使用它,那么返回一个空的迭代。

它应该是

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

verify(dependenciesRepository).deleteAll();
verify(dependenciesRepository).saveAll(captor.capture());
Run Code Online (Sandbox Code Playgroud)

  • 不,这是不可能的。我不知道你在说什么,因为你没有发布代码。如果“它没有连接”,那么您可能需要模拟该连接或提供连接的对象。或者重构代码并将该方法放入可以模拟的单独的注入对象中。 (2认同)