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

ami*_*ith 9 spring mockito spring-boot java-annotations

考虑我的情况

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

  public void doSomeAction(String mimeType) {
    converter1.execute();
    converter2.execute();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码。

为了测试这个

@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");
  }
}
Run Code Online (Sandbox Code Playgroud)

这里没有注入模拟,请帮助使用适当的机制来模拟合格的 bean。

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

jhe*_*cks 5

不确定您遇到什么错误,但您的测试类无法编译,因为您看起来像是打算使用关键字 成为变量名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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*pel 5

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

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

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

这是我的解决方案:

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

Run Code Online (Sandbox Code Playgroud)

就如此容易。


rid*_*ddy 4

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

@Configuration
public class TestConfig {
   @Bean
   public MyService myService() {
      return Mockito.mock( MyService.class );
   }
}
Run Code Online (Sandbox Code Playgroud)