通过直接使用上下文获取的Spring / Mock组件
我们有一个使用Spring
注释来配置其上下文的项目。 为了测试这个项目,我们使用Mockito
,它是Spring
扩展。
在测试中,我需要用模拟/间谍版本来重写一些bean。
使用@Mock
/ @Spy
和@InjectMock
注释,我可以使用自动装配机制使用spy进行bean。
现在我有一个第三方组件创建另一个Spring上下文,然后将这两个上下文合并在一起。 该第三方组件使用对上下文的调用来检索bean:
applicationContext.getBean(key);
在这种情况下,@ Mock / @ Spy和@InjectMock组合不起作用。
我已经实施的'解决方法'解决方案是一个XML文件,我在其中声明了我的窥探bean:
<mockito:spy beanName="beanToSpy"/>
为了留在注释世界中,我尝试了以下类似问题中提到的springockito注释:将Mockito模拟注入Spring bean及其重复内容:如何在Spring上下文中注入模拟
但是这个bean没有被窥探或者嘲笑,我可能有一个配置错误。
我目前的设置是:
一个负责测试Spring配置的基类:
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("test")
@ContextConfiguration(loader= SpringockitoContextLoader.class, locations ={"/config.xml","/test-config.xml"})
public abstract class BaseTest {
//...
}
一个想要使用模拟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
版本取代,而是普通的旧版本。
编辑:执行查找的第三方组件使用其自己的弹簧父上下文并将当前的弹簧上下文添加到它自己的。 在上下文完全加载后,检索我想要模拟的组件的查找。
我应该怎么做才能在mock
/ spy
版本中正确替换上下文中的bean? 我使用@WrapWithSpy
/ @ReplaceWithMock
的方式有什么问题?
什么时候打电话给
applicationContext.getBean(key);
发生? 在SpringockitoContextLoader有机会将其替换为间谍之前,它是否有可能检索到bean?
留在注释世界中的一个解决方案是在java config中覆盖bean:
@Bean
public MyBeanType myBeanType() {
return spy(new MyBeanType(...))
}
执行此操作的更常规方法是根据需要在测试中简单地嘲笑它们:
public class MyTest extends BaseTest {
@Test public void someTest() {
MyService myMockService = Mockito.mock(MyService.class);
// define when's
// perform verification
}
你可以使用SpringReflectionTestUtils注入,或者如果使用setter注入只是正常设置。
如果您在测试类中使用全局模拟bean进行多个测试,结果可能会令人困惑。
链接地址: http://www.djcxy.com/p/82051.html上一篇: Spring / Mock components that are retrieved by using the context directly