【发布时间】:2013-02-15 13:39:14
【问题描述】:
我正在尝试用 Mockito 模拟对象替换 @Autowired 对象。通常的做法是使用 Springockito 使用 xml:
<mockito:mock id="SomeMock" class="com.package.MockInterface" />
目前我正在尝试转而使用 Spring 的 JavaConfig 来完成这项工作。突然之间,Java 表达式比 xml 更加冗长:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTestClass {
@Configuration
static class Config {
@Bean
public MockInterface somethingSpecial() {
return Mockito.mock(MockInterface.class);
}
}
@Autowired MockInterface mockObj;
// test code
}
我发现了一个名为 Springockito-annotations 的库,它允许您执行以下操作:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=SpringockitoContextLoader.class)
public class MyTestClass {
@Autowired @ReplaceWithMock MockInterface mockObj;
// test code
}
很明显,漂亮多了 :) 唯一的问题是这个上下文加载器不允许我将 @Configuration 和 JavaConfig 用于其他 bean(如果我这样做,Spring 会抱怨没有匹配那些自动装配的候选字段)。
你们知道让 Spring 的 JavaConfig 和 Springockito-annotations 发挥良好作用的方法吗?或者,是否有另一种创建模拟的简写?
作为一个不错的奖励,使用 Springockito 和 xml 配置,我能够模拟出具体的类,而无需为其依赖项提供自动装配候选者(如果有的话)。没有xml,这不可能吗?
【问题讨论】:
-
也许我有点困惑,但你为什么不
@Autowired你想要的应用程序上下文中的 bean 和@Mock你想要模拟的 bean?注意:如果您使用@Mock,则需要在每次测试前通过在测试类中调用MockitoAnnotations.initMocks(this)来初始化这些模拟。 -
您为什么不简单地手动接线进行测试?
-
如果我想手动连接它们,我需要更改类以允许我注入模拟对象。 Springockito 允许您做的是使用现有的自动装配机制来注入模拟。
-
你为什么要换班?如果是通过构造函数注入的,只需要调用构造函数即可。如果它是由 setter 注入的,则只需要调用 setter 即可。如果它使用字段注入,您只需要在测试中使用
@Mock和@InjectMocks注释(这也适用于构造函数和setter 注入)。
标签: java spring integration-testing mockito spring-java-config