在使用 JUnit 进行单元测试时,我在传递依赖项时遇到了一些麻烦。
考虑这些代码:
这是我要测试的类的依赖注入,我们称之为控制器。
@Inject private FastPowering fastPowering;
这是单元测试:
@RunWith(MockitoJUnitRunner.class)
public class ControllerTest {
@Mock
FastPowering fastPower;
@InjectMocks
Controller controller;
@Test
public void test() {
assertEquals(
(controller.computeAnswer(new BigDecimal(2), 2)).longValue(),
(long) Math.pow(2, 2));
}
}
似乎 fastPower 为空,请解释如何解决该问题。空指针异常,因为在 .computeAnswer 方法中调用了 @injected 字段(fastPower))
编辑:
解决了我应该阅读@Mock 和@Spy 之间的区别…
由于有很多评论,我正在为解决方案添加更多上下文
不同之处在于,在 mock 中,您正在创建一个完整的 mock 或假对象,而在 spy 中,有真实的对象,您只是监视或存根它的特定方法。而在 spy 对象中,当然,因为它是一个真正的方法,当你不对方法进行存根时,它就会调用真正的方法行为。
如果 fastPower 被注释为 @Mock 它的方法是虚拟的,但 controller.computeAnswer 依赖于它们来计算。必须提供行为。
如果在没有存根的情况下使用 spy,那么将执行 fastPower 的真正实现,最终返回所需的值。
另一种选择是使用真正的 FastPowering 实例
https://github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) https://github.com/mockito/mockito/wiki/Mocking-Object-Creation
还有一些 stackoverflow 线程概述了 模拟框架中模拟与间谍 的区别
简短回答:将 @Mock
替换为 @Spy
并且应该可以正常工作
原文由 radpet 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用
MockitoAnnotations.initMocks
启动@Mock
和@InjectMocks
对象。你的测试看起来像: