使用 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 为以下代码编写 junit 测试?