Java 通过直接使用上下文检索的Spring/Mock组件
我们有一个使用Java 通过直接使用上下文检索的Spring/Mock组件,java,spring,testing,mockito,Java,Spring,Testing,Mockito,我们有一个使用Spring注释来配置其上下文的项目。 为了测试这个项目,我们使用了Mockito和它的Spring扩展 在测试中,我需要用mock/spy版本覆盖一些bean 通过@Mock/@Spy和@InjectMock注释,我已经能够使用Spy for Bean,使用自动布线机制 现在我有了一个第三方组件,它创建了另一个Spring上下文,然后将这两个上下文合并在一起。此第三方组件使用对上下文的调用检索bean: applicationContext.getBean(key); 在本例中
Spring
注释来配置其上下文的项目。
为了测试这个项目,我们使用了Mockito
和它的Spring
扩展
在测试中,我需要用mock/spy版本覆盖一些bean
通过@Mock
/@Spy
和@InjectMock
注释,我已经能够使用Spy for Bean,使用自动布线机制
现在我有了一个第三方组件,它创建了另一个Spring上下文,然后将这两个上下文合并在一起。此第三方组件使用对上下文的调用检索bean:
applicationContext.getBean(key);
在本例中,@Mock/@Spy和@InjectMock组合不起作用
我采用的“变通”解决方案是一个XML文件,我在其中声明了我的spied bean:
<mockito:spy beanName="beanToSpy"/>
要使用模拟bean的测试类:
public class MyTest extends BaseTest {
@ReplaceWithMock @Autowired MyService myService;
@WrapWithSpy @Autowired OtherService otherService;
@Test public void someTest() {
doReturn(x).when(myService).call();
doReturn(y).when(otherService).process();
}
}
不幸的是,在MyTest
中,bean没有被它们的mock
/spy
版本所取代,它是普通的旧常规版本
编辑:
执行查找的第三方组件使用自己的spring父上下文,并将当前spring上下文添加到自己的父上下文中。检索要模拟的组件的查找发生在上下文完全加载之后
我应该怎么做才能正确地用mock
/spy
版本替换上下文中的bean?
我使用
@WrapWithSpy
/@ReplaceWithMock
的方式有什么问题?执行此操作的更传统的方式是根据需要在测试中对其进行模拟:
public class MyTest extends BaseTest {
@Test public void someTest() {
MyService myMockService = Mockito.mock(MyService.class);
// define when's
// perform verification
}
您可以使用SpringReflectionTestUtils进行注入,或者如果使用setter注入,只需正常设置即可
如果在具有多个测试的测试类中使用全局模拟bean,结果可能会令人困惑。何时调用
applicationContext.getBean(key);
发生了什么?它是否可能在SpringockitoContextLoader有机会用间谍替换它之前检索bean
留在注释世界中的一个解决方案是重写java配置中的bean:
@Bean
public MyBeanType myBeanType() {
return spy(new MyBeanType(...))
}
我想要的是一个全局模拟bean。这很好,因为在每个测试之间都会刷新上下文(@DirtiesContext)。我需要这个,因为我不是直接测试组件;模拟服务将被检索并由具有上下文访问权限的第三方组件使用。我需要“间谍”服务,以便当第三方组件将使用它时,我可以测试它的行为。(我们正在测试activiti工作流流程,这就是我们设置此设置的原因)因此,使用的解决方案有效,您想用注释替换吗?@frant.hartm是的,我不能再睡了;)谢谢你,我会试试这个选择,我会让你知道的。
@Bean
public MyBeanType myBeanType() {
return spy(new MyBeanType(...))
}