如何在Spring上下文中注入模拟

我有一个使用一些Spring上下文的testing。 在这些情况下,宣布了一些bean。 我希望testing使用上下文bean的实际实现,除了其中之一,我想要使用MOCK。

我试图使testingconfiguration组件(使用@Configuration注释),但XML似乎优先于@Bean注释,所以它不起作用,这样:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"context1.xml", "context2.xml", ...}) @Configuration public class MyTest{ @Inject private MyTargetBean target; private AnotherBean myMock = mock(AnotherBean.class); @Bean public AnotherBean myMock() { return myMock; } ..... 

我知道我可以在XML中定义Mocks,但为此我需要为每个testing添加一个额外的XML文件。 我想避免这种复杂性。

有没有办法在一个上下文中注入一个bean(像一个模拟),而不是通过XML?

谢谢!

是的,你在正确的轨道上,把一个@Bean模拟@Configuration类是一种方法,我将描述我的经验:

诀窍是,你需要使用一组不同的.xml文件,纯粹是为了testing而排除这些bean的活动版本。

 @ContextConfiguration(locations = {"context1-test.xml", "context2-test.xml", ...}) 

并且“-test-xml”文件进入src/test/resources

至less这是我做同样事情的经验。 也许有一些方法可以用模拟版本来“覆盖”这个bean,但是我还没有意识到这一点。

我也select把这些模拟(我有5个)一起放在一个自己的configuration中:

 @Configuration public class MockServicesProvider { @Bean public AnotherBean myMock() { return mock(AnotherBean.class); } } 

这个问题的另一个有趣的部分是initMocks(this);的常见用法initMocks(this); 在你的testing类的@Before方法中。

如果嘲笑在其他地方被使用(他们,那就是为什么你把它们连接起来…),那么initMocks(this)会在testing之间把它们吹走(而不是字面上 – 只是新的模拟将被创build,嘲笑其他物体将被“丢失”)。

解决方法是在每次testing之前,在@Before方法中调用mockito的reset(mockObject) 。 同样的模拟被重置(所有的when和交互),而不会产生新的模拟。

请注意, reset的Mockito文档说非常严厉,这种方法不应该被普遍使用,除了在通过dependency injection应用模仿的情况下,因为我们确实在这种情况下做:)

玩的开心!

这确实是重复的

将Mockito嘲笑注入Spring bean

Springockito注释正是我所期待的

https://bitbucket.org/kubek2k/springockito/wiki/springockito-annotations