问题 @InjectMocks的等效方法


什么是以下等效方法:

@Mock
MyType1 myType1;

@Autowired
@InjectMocks
MyType2 myType2;

我可以替换 @Mock 同 mock(MyType1.class)

但我怎么能取代 @InjectMocks 用方法调用?像这样的东西:

injectMocks(MyType2.class)

2404
2017-10-12 07:35


起源



答案:


为何使用 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,请使用 springockito 由Brice建议,并建立你的模拟 MyType1 在您的应用程序上下文


2
2017-10-12 12:41



链接已经死了。 - Tarun Maganti
什么是IOC ???? - jonney
@jonney IoC =控制反转,见 martinfowler.com/bliki/InversionOfControl.html - the dude


答案:


为何使用 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,请使用 springockito 由Brice建议,并建立你的模拟 MyType1 在您的应用程序上下文


2
2017-10-12 12:41



链接已经死了。 - Tarun Maganti
什么是IOC ???? - jonney
@jonney IoC =控制反转,见 martinfowler.com/bliki/InversionOfControl.html - the dude


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

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

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

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

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

希望有所帮助


9
2017-10-12 08:05



链接已经死了。 - Tarun Maganti
@TarunMaganti我更新了链接。虽然现在看起来有几个springockito的叉子,我认为这个是正式的,但在使用之前检查;) - Brice