首页 > 解决方案 > Mockito - 仅针对特定参数的模拟方法调用

问题描述

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

@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-boot:2.1.4.RELEASE mockito-junit-jupiter:2.23.0

标签: javamockitojunit5

解决方案


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


推荐阅读