如何在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