gpt4 book ai didi

java - @InjectMocks 后为空

转载 作者:行者123 更新时间:2023-12-04 06:18:25 25 4
gpt4 key购买 nike

在使用 JUnit 进行单元测试时,我在传递依赖项时遇到了一些麻烦。
考虑这些代码:
这是我要测试的类的依赖注入(inject),我们称之为 Controller 。

@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 中,存在真实对象,而您只是监视或 stub 它的特定方法。当然,在 spy 对象中,由于它是一个真实的方法,当您没有对方法进行 stub 时,它会调用真实的方法行为。
如果 fastPower 被注释为 @Mock 它的方法是虚拟的,但 controller.computeAnswer 依赖于它们来计算。必须提供行为。
如果 spy 在没有 stub 的情况下使用,那么 fastPower 的真正实现将被执行,最终返回所需的值。
另一种选择是使用真正的 FastPowering 实例
https://github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes)
https://github.com/mockito/mockito/wiki/Mocking-Object-Creation
还有一些stackoverflow线程概述了区别 Mocking vs. Spying in mocking frameworks
简答:替换 @Mock@Spy并且应该可以正常工作

最佳答案

使用MockitoAnnotations.initMocks发起@Mock@InjectMocks对象。您的测试看起来像:

@Mock
FastPowering fastPower;

@InjectMocks
Controller controller;

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

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

关于java - @InjectMocks 后为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27065195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com