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
我想为特定参数模拟方法调用并为其他参数调用真实方法。 我有:
@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