在使用 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))
Edit:
解决了我应该阅读@Mock 和@Spy 之间的区别...
由于有很多评论,我正在为解决方案添加更多上下文
不同之处在于,在模拟中,您正在创建一个完整的模拟或伪造对象,而在间谍中,有真实的对象,您只是监视或存根它的特定方法。当然,在间谍对象中,由于它是一个真正的方法,因此当您不对该方法进行存根时,它将调用真正的方法行为。
如果fastPower被注释为@Mock它的方法是虚拟的,但是控制器.computeAnswer取决于他们来计算。人必须提供行为。
如果在没有存根的情况下使用间谍,那么真正的实现快速电源正在执行,最终返回所需的值。
另一种选择是使用真实的快速供电实例
https://github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) https://github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes)
https://github.com/mockito/mockito/wiki/Mocking-Object-Creation https://github.com/mockito/mockito/wiki/Mocking-Object-Creation
一些 stackoverflow 线程概述了差异模拟框架中的模拟与间谍活动 https://stackoverflow.com/questions/12827580/mocking-vs-spying-in-mocking-frameworks
简短回答:替换@Mock
with @Spy
并且应该工作正常