如何在春季环境中注入模拟



我有一个使用一些Spring上下文的测试。在这些上下文中,声明了许多豆子。我希望测试使用上下文的 bean 的实际实现,除了其中一个,我想使用 MOCK。

我试图使测试配置组件(带有@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 中定义模拟,但为此,我希望在其中执行此操作的每个测试都需要一个额外的 XML 文件。我想避免这种复杂性。

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

谢谢!

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

诀窍是您需要使用一组不同的.xml文件纯粹用于测试,从而排除这些 bean 的实时版本。

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

并且"-test-xml"文件进入src/test/resources.

至少这是我做同样事情的经验。也许有某种方法可以用模拟版本"覆盖"豆子,但到目前为止我还不知道。

我还选择将模拟(我有 5 个)放在自己的配置中:

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

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

如果模拟在其他地方使用(它们是,这就是为什么你要连接它们......),那么initMocks(this)会在测试之间将它们吹走(不是字面意思 - 只是将创建新的模拟,并且连接在其他对象中的任何其他模拟将被"丢失")。

对此的解决方案是在每次测试之前在@Before方法中调用 mockito 的reset(mockObject)。相同的模拟被重置(所有when和交互),而不会创建新的模拟。

请注意,reset的 Mockito 文档非常严厉地指出,这种方法通常不应该使用,除非在通过依赖注入应用模拟的上下文中,正如我们在本例中所做的那样:)

玩得愉快!

它确实是

将莫基托模拟注入春豆

Springockito注释正是我正在寻找的

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

最新更新