@InjectMocks的等效方法

Kev*_*dra 17 java junit mocking mockito

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

@Mock
MyType1 myType1;

@Autowired
@InjectMocks
MyType2 myType2;
Run Code Online (Sandbox Code Playgroud)

我可以代替@Mock使用mock(MyType1.class).

但是如何@InjectMocks用方法调用替换?像这样的东西:

injectMocks(MyType2.class)
Run Code Online (Sandbox Code Playgroud)

Bri*_*ice 13

Mockito中没有用于模拟注入的公共API.此外,由于此注释主要是在测试中布置事物的方式上进行的,因此它与测试的初始化阶段相关.

虽然它可能会在未来某个时候发生变化.

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

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

你可能想看看springockito,这是另一个试图在Spring中缓解Mockito模拟创建的项目.

希望有所帮助


Alb*_*ban 6

为什么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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是评论而不是答案,因为它并没有真正回答问题:如何手动调用`@InjectMocks`? (9认同)