Mockito - 仅针对特定参数的模拟方法调用

Mockito - mock method call just for particular parameter

我想为特定参数模拟方法调用并为其他参数调用真实方法。 我有:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@SpringBootTest(classes = AppConfig.class)
@ActiveProfiles("mvntest")
public class OKMMoveMergeTest {
    @MockBean
    private FolderDAO folderDAO;
    ...

    @Test
    public void callDocCreateEp() throws Exception {
        Mockito.doCallRealMethod().when(folderDAO).getFoldersHierarchy(any(EHierarchyType.class));
        Mockito.doReturn(screwedHierarchy).when(folderDAO).getFoldersHierarchy(EHierarchyType.CLIENT_DOC);

        ...
    }
}

有了这个,我得到了 folderDAO.getFoldersHierarchy(EHierarchyType.CLIENT_DOC) 的模拟结果,但是当我尝试用任何其他参数调用它时,我得到 NullPointerException

那么我做错了什么或者我应该如何为特定参数存根方法调用?

junit-jupiter-api: 5.4.0

junit-jupiter-engine: 5.4.0

spring-引导:2.1.4.RELEASE mockito-junit-jupiter:2.23.0

您需要为您的 bean 创建一个 Spy 而不是 Mock。您可以使用@SpyBean 注释。这将创建一个 Spy 并以与@MockBean 相同的方式将其放入上下文中。在 Spy 的情况下,你将有一个真实的对象在它后面,但你仍然可以在需要时覆盖行为,就像你有一个模拟一样。有关示例,请参见以下 article