@InjectMocks后为空

rad*_*pet 7 null mocking inject mockito

我在使用JUnit进行单元测试时遇到了一些麻烦.

考虑以下代码:

这是我要测试的类中的dependacy注入,我们称之为Controller.

@Inject private FastPowering fastPowering;  
Run Code Online (Sandbox Code Playgroud)

这是单元测试:

@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));
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎fastPower为null,请解释如何解决这个问题.空指针异常,因为在.computeAnswer方法中调用了@injected字段(fastPower)

编辑:

解决了我应该读过@Mock和@Spy之间的区别......

Kha*_*lid 10

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

@Mock
FastPowering fastPower;

@InjectMocks
Controller controller;

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

@Test
public void test() {
    ....
}
Run Code Online (Sandbox Code Playgroud)

  • 同样的问题,@InjectMocks 和 MockitoAnotations.initMocks(this) 之后的 NPE (6认同)
  • init 模拟看起来已被弃用 (4认同)

Abd*_*sin 10

我使用了错误的注释,如果你想在 Mockito 测试中@Test使用@InjectMocksand ,那么你应该@Mock

  1. @ExtendWith(MockitoExtension.class)在您的测试类上添加注释
  2. @Test (org.junit.jupiter.api.Test)使用而不是注释来注释您的测试方法@Test (org.junit.Test)。请小心用于此注释的导入。

这适用于mockito-core:3.6.28