2014-06-20 29 views
0

我们有一个项目使用Spring注释来配置其上下文。 为了测试这个项目,我们使用Mockito和它的Spring扩展名。通过直接使用上下文检索的弹簧/模拟组件

在测试中,我需要用模拟/间谍版本重写一些bean。

随着@Mock/@Spy@InjectMock注释我已经能够使用自动装配机制的豆间谍。

现在我有第三方组件创建另一个Spring上下文,然后将两个上下文合并在一起。此第三方组件使用调用上下文来检索bean:

applicationContext.getBean(key); 

在这种情况下,@ Mock/@ Spy和@InjectMock组合不起作用。

的“处理方法”解决方案,我已经到位是在我宣布我的窥探豆的XML文件:

<mockito:spy beanName="beanToSpy"/> 

要留在标注的世界里,我已经试过springockito-annotations在这些类似的问题提到: Injecting Mockito mocks into a Spring bean 及其副本: How to inject a Mock in a Spring Context

但豆不窥探或嘲笑,我可能配置错误。

我目前的设置是:

一个基类,负责在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中,这些豆不会被它们的mock/spy版本取代,它是普通的老式常规版本上。

编辑: 执行查找的第三方组件使用其自己的弹簧父上下文并将当前的弹簧上下文添加到它自己的。在上下文完全加载后,检索我想要模拟的组件的查找。

我应该怎么做才能正确地用mock/spy版本替换上下文中的bean? 我使用的方式有什么问题@WrapWithSpy/@ReplaceWithMock

+0

因此与解决方案<的Mockito:间谍beanName =“beanToSpy” />的作品,你想替换成注释? –

+0

@ frant.hartm是的,我不能再睡了;) – Guillaume

回答

0

执行该更传统的方式是通过根据需要简单地嘲笑他们在测试:

public class MyTest extends BaseTest { 
    @Test public void someTest() { 
     MyService myMockService = Mockito.mock(MyService.class); 
     // define when's 
     // perform verification 
     } 

可以,或者如果使用setter注入刚刚成立正常使用SpringReflectionTestUtils注入。

如果在具有多个测试的测试类中使用全局模拟bean,结果可能会令人困惑。

+0

我想要的是一个全球性的嘲弄的豆。这很好,因为上下文在每个测试(@DirtiesContext)之间刷新。我需要这个,因为我不直接测试组件;模拟的服务将被有权访问上下文的第三方组件检索和使用。我需要'侦察'服务,所以当第三方组件使用它时,我可以测试它的行为。 (我们正在测试activiti工作流程,为什么我们有这个设置) – Guillaume

1

何时调用

applicationContext.getBean(key); 

发生什么呢?在SpringockitoContextLoader有机会将其替换为间谍之前,它是否有可能检索到bean?

一个解决方案,以留在注释世界将覆盖Java的配置豆:

@Bean 
public MyBeanType myBeanType() { 
    return spy(new MyBeanType(...)) 
} 
+0

谢谢,我会尝试这个选项,我让你知道它。 – Guillaume