为什么我在模拟时得到 NullPointerException?

Why I get NullPointerException while mocking?

为什么会出现 NullPointerException?

这是我的代码:

@Stateless
@LocalBean
class SomeDao {

@PersistenceContext(unitName = "some-value")
private EntityManager entityManager;

public EntityManager getEntityManager() {
    return this.entityManager;
}

public long getNextId() {
    long someLongValue = getEntityManager().someMethod();
    //some code
    return someLongValue;
}
}

class SomeTest() {
@Spy
private SomeDao dao = new SomeDao();

@Test
public void someTestMethod() {
    MockitoAnnotations.initMocks(this);
    when(dao.getNextId()).thenReturn(10L);
}
}

当我 运行 测试时,我得到以下异常: java.lang.NullPointerException 在 com.some.api.some.package.dao.SomeDao.getNextId(SomeDao.java:13) ...

稍后我想添加新的 类 到 mock,getNextId 方法将在其中一个中被调用。

谢谢!

MockitoAnnotations.initMocks(this) 应该在测试方法之前执行,在 JUnit

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

或者在 TestNG 中使用 @BeforeMethod

MockitoAnnotations.initMocks(this) method has to called to initialize annotated fields.

In above example, initMocks() is called in @Before (JUnit4) method of test's base class.

当您使用@Spy 时,您不能使用when/thenReturn 语法。

您必须使用 doReturn/when 语法。

另请参阅此 post:Mockito - difference between doReturn() and when()

因此,将您的@Spy 更改为@Mock 或更改您的存根,将解决问题。