Mr.*_*art 37 java spring dependency-injection mocking mockito
我有一个使用一些Spring上下文的测试.在这些上下文中,声明了许多bean.我希望测试使用上下文的bean的实际实现,除了其中一个,我想要使用MOCK.
我尝试将Test作为一个配置组件(使用@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; }
.....
Run Code Online (Sandbox Code Playgroud)
我知道我可以在XML中定义Mocks,但为此我需要为每个测试添加一个额外的XML文件,我希望在其中执行此操作.我想避免这种复杂性.
有没有办法在一个上下文中注入bean(比如模拟)而不是通过XML?
谢谢!
vik*_*eve 35
是的,你走在正确的轨道上,@Bean在@Configuration课堂上放一个模拟是一种方法,我将描述我的经历:
诀窍是你需要使用一组不同的.xml文件纯粹用于测试,这些文件排除了那些bean的实时版本.
@ContextConfiguration(locations = {"context1-test.xml", "context2-test.xml", ...})
Run Code Online (Sandbox Code Playgroud)
并且"-test-xml"文件进入src/test/resources.
至少那是我做同样事情的经验.也许有一些方法可以用模拟版本"覆盖"bean,但到目前为止我还没有意识到它.
我还选择将mocks(我有5个)放在一个自己的配置中:
@Configuration
public class MockServicesProvider {
@Bean
public AnotherBean myMock() { return mock(AnotherBean.class); }
}
Run Code Online (Sandbox Code Playgroud)
此问题的另一个有趣部分是测试类initMocks(this);的@Before方法中的常见用法.
如果嘲笑正在其他地方使用(它们就是这样,那就是为什么要将它们连接起来......)那么initMocks(this)它们会在测试之间将它们吹走(不是字面意思 - 只是会创建新的模拟而任何其他的模拟连接起来其他对象将"丢失").
解决方法是在每次测试之前reset(mockObject)在@Before方法中调用mockito .重置相同的模拟(所有when的和相互作用),而不创建新的模拟.
请注意,Mockito文档reset非常严厉地说这种方法通常不应该使用,除非在通过依赖注入应用模拟的上下文中,因为我们确实在这种情况下做:)
玩得开心!
它确实是重复的
Springockito-annotation 正是我正在寻找的
https://bitbucket.org/kubek2k/springockito/wiki/springockito-annotations