繁体   English   中英

Java - 如何通过使用 Mockito 模拟 impl

[英]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 注释

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing.spring-boot-applications.mocking-beans

如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM