2

为什么我会得到 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 at com.some.api.some.package.dao.SomeDao.getNextId(SomeDao.java:13) ...

稍后我想添加新的类来模拟,getNextId 方法将在其中一个中调用。

谢谢!

4

2 回答 2

2

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

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

或者在 TestNG 中使用@BeforeMethod

MockitoAnnotations.initMocks(this)必须调用方法来初始化带注释的字段。

在上面的例子中,initMocks() 在测试基类的@Before (JUnit4) 方法中被调用。

于 2019-01-28T10:25:08.327 回答
1

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

您必须使用 doReturn/when 语法。

另请参阅这篇文章:Mockito - doReturn() 和 when() 之间的区别

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

于 2019-01-28T10:32:04.963 回答