@InjectMocks 后为空

新手上路,请多包涵

在使用 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 许可协议

阅读 3.2k
1 个回答

使用 MockitoAnnotations.initMocks 启动 @Mock@InjectMocks 对象。你的测试看起来像:

 @Mock
FastPowering fastPower;

@InjectMocks
Controller controller;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void test() {
    ....
}

原文由 Khalid 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题