[英]Java - How to Mock impl via using Mockito
我在我的班级中创建了这个存储库,如下所示:
private static ModuleRepository repository = new ModuleRepository();
它通过以下方式调用:
repository.isModuleCached(moduleType,taxModuleInfo.getModuleYear(), taxModuleInfo.getModuleVersion()
但是,当我尝试在我的测试类中模拟它时,我实际上无法返回我想要的模拟结果,而是调用实际的存储库,就好像我的模拟调用被忽略了一样。
我的测试用例设置包括:
@Mock
private ModuleRepository repository;
我的测试课程:
when(repository.isModuleCached(anyString(), anyString(), anyString())).thenReturn(resp);
类中的实际存储库不是自动装配的,它是实例化的,也许是这样?
使用@MockBean 而不是@Mock。 它告诉 Spring Boot 你正在模拟一个自动装配的 bean。
@MockBean
private ModuleRepository repository;
您的测试还必须使用 @SpringBootTest 注释
如果ModuleRepository
来自您无法控制的库,则为它定义一个 Spring Bean,如下所示:
@Configuration
public class RepoConfig {
@Bean
public ModuleRepository getModuleRepository() {
return new ModuleRepository();
}
}
现在您可以使用@Autowired
将其作为 Spring Bean 注入,或者更好的是,使用构造注入。
完成此操作后,您可以在测试中使用@MockBean
:
@MockBean
private ModuleRepository repository;
您应该在测试设置期间初始化所有非 bean 模拟对象
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
避免when(xxx.xxx()).thenReturn(xxx)
。
尝试doReturn(xxx).when(xxx).xxx()
代替。
这是一个例子: doReturn(resp).when(repository).isModuleCached(anyString(), anyString(), anyString());
此外,不会注入存储库值。 这是您的示例代码: private static ModuleRepository repository = new ModuleRepository();
因为您是手动初始化变量,所以您必须使用反射手动将其替换为 Mock 对象。
Spring 提供了ReflectionTestUtils
这将有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.