29

以下内容的等效方法是什么:

@Mock
MyType1 myType1;

@Autowired
@InjectMocks
MyType2 myType2;

我可以@Mockmock(MyType1.class).

但是我怎样才能@InjectMocks用方法调用代替呢?像这样的东西:

injectMocks(MyType2.class)
4

2 回答 2

16

Mockito 中没有用于模拟注入的公共 API。另外,由于此注释主要是根据测试中的布局方式驱动的,因此它与测试的初始化阶段相当相关。

尽管它可能会在未来的某个时候发生变化。

但是,Mockito 注释字段可以由MockitoJUnitRunner或初始化MockitoAnnotations.initMocks()。它们都创建模拟实例并执行注入。

我还在您的代码中看到您正在使用的代码@Autowired- 因此可能是通过 XML 配置的 spring 的东西。@InjectMocks并不是真正为与其他依赖注入框架一起工作而开发的,因为开发是由单元测试用例驱动的,而不是集成测试。

您可能想看看springockito,这是另一个试图在 Spring 中简化 Mockito 模拟创建的项目。

希望有帮助

于 2012-10-12T08:05:24.227 回答
7

为什么Autowired在你的junit测试中使用?由于您正在模拟依赖项,MyType2因此您必须在编写测试时知道它的 concreate 实现。

那么你不需要也不应该使用 Spring 或任何注入框架来创建MyType2你想要测试的实例。直接在您的测试初始化​​中创建它!我知道在使用 IoC 框架几年后,编写起来很困难,myType2 = new MyType2Impl(mock(myType1.class))但它确实会让你的测试更简单、更快(因为没有要构建的应用程序上下文)。例如:

@Before
public void setup() {
  myType1 = mock(MyType1.class);
  myType2 = new MyType2Impl(myType1);
}

但是,如果您真的想在您的 junit 测试中使用 IoC,请使用Brice 建议的springockito,并MyType1在您的应用程序上下文中构建您的模拟。

于 2012-10-12T12:41:07.417 回答