@InjectMocks 之后为空

2024-03-17

在使用 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并且应该工作正常


Use MockitoAnnotations.initMocks启动@Mock and @InjectMocks对象。你的测试看起来像这样:

@Mock
FastPowering fastPower;

@InjectMocks
Controller controller;

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

@Test
public void test() {
    ....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@InjectMocks 之后为空 的相关文章

随机推荐