使用 mockito 为 spring-boot 应用程序模拟 Qualified bean

Posted

技术标签:

【中文标题】使用 mockito 为 spring-boot 应用程序模拟 Qualified bean【英文标题】:Mocking the Qualified beans using mockito for a spring-boot application 【发布时间】:2016-10-06 21:54:13 【问题描述】:

考虑一下我的情况

public class SomeClass 
  @Autowired @Qualifier("converter1") private IConverter converter1;
  @Autowired @Qualifier("converter2") private IConverter converter2;

  public void doSomeAction(String mimeType) 
    converter1.execute();
    converter2.execute();
  

这是我的代码。

为了测试这个

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest 
  @Mock(name="converter1") IConverter converter1;
  @Mock(name="converter2") IConverter converter2;
  @InjectMocks SomeClass class = new SomeClass();
  @Test
  public void testGetListOfExcelConverters() throws Exception 
    class.doSomeAction("abcd");
  

这里没有注入模拟,请帮助模拟合格 bean 的正确机制。

如果这不是使用 spring 编码的正确方法,请告诉我正确的使用方法。

【问题讨论】:

【参考方案1】:

不确定您遇到了什么错误,但您的测试类无法编译,因为您使用关键字class 看起来像是要成为变量名。这对我有用:

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest 
    @Mock(name="converter1") IConverter converter1;
    @Mock(name="converter2") IConverter converter2;

    @InjectMocks
    SomeClass clazz = new SomeClass();

    @Test
    public void testGetListOfExcelConverters() throws Exception 
        clazz.doSomeAction("abcd");
        verify(converter1).execute();
        verify(converter2).execute();
    

“为我工作”是指测试实际运行并通过。请注意,我添加了几个 verify 语句来断言注入的模拟被调用。

我按原样使用了您提供的SomeClass 代码。

【讨论】:

对不起,关于类的错字,感谢纠正。我使用springboot,但是我的依赖项没有设置,并且在调用converter1.execute()时我得到了NPE。如果可能的话,您能否阐明可能是什么问题。 您必须提供有关您的实际类和/或配置的更多详细信息。正如我所说,您提供的示例基本上是有效的(一旦您修复了错字),所以我真的猜不出哪里出了问题。【参考方案2】:

对我来说,现有的两个答案都不够。

@riddy 的回答没有考虑不同的测试用例。

@jhericks 的回答没有使用 Spring 上下文,这导致了其他问题。

这是我的解决方案:

@MockBean
@Qualifier("myNamedBean")
private SomeBean someBean;

就这么简单。

【讨论】:

【参考方案3】:

您可以使用测试配置模拟 bean:

@Configuration
public class TestConfig 
   @Bean
   public MyService myService() 
      return Mockito.mock( MyService.class );
   

【讨论】:

并查看tedvinke.wordpress.com/2014/02/13/…,了解如何使用 InjectMocks 以及为什么不应该使用 ^^ 感谢链接真的很有帮助。我将从我的项目中删除 injectmocks。其次,我如何在测试类中指定配置类,如果可能的话,你能提供一些例如。 简单,如果你的test文件夹中的config类的包名与src文件夹中的包名匹配,就会自动完成。【参考方案4】:

我找到了这个解决方案:

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest 

  @Mock()
  @Qualifier("converter1")
  IConverter converter1;

  @Mock() 
  @Qualifier("converter1")
  IConverter converter2;

  @InjectMocks SomeClassTest testObj = new SomeClassTest();

  @Test
  public void testGetListOfExcelConverters() throws Exception 
    testObj.doSomeAction("abcd");
    verify(converter1).execute();
    verify(converter2).execute();
  

顺便说一句,我在文档中没有找到这个。

【讨论】:

以上是关于使用 mockito 为 spring-boot 应用程序模拟 Qualified bean的主要内容,如果未能解决你的问题,请参考以下文章

如何提供嵌入式数据库供 Mockito 使用?

使用 Mockito 在 REST 控制器中模拟类

基于spring-boot的应用程序的单元+集成测试方案

如何使用 mockito 为以下代码编写 junit 测试?

如何使用 mockito 为以下异常处理程序方法编写单元测试?

使用 Mockito 为 Firebase 用户身份验证设置单元测试