Java 为什么我在嘲笑时会得到NullPointerException?

Java 为什么我在嘲笑时会得到NullPointerException?,java,testing,mockito,spy,Java,Testing,Mockito,Spy,为什么我会得到NullPointerException 这是我的密码: @Stateless @LocalBean class SomeDao { @PersistenceContext(unitName = "some-value") private EntityManager entityManager; public EntityManager getEntityManager() { return this.entityManager; } public long getN

为什么我会得到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方法

谢谢大家!

应该在JUnit中的测试方法之前执行

或者在TestNG中使用
@beforethod

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

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


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

必须使用doReturn/when语法

另见本帖:


因此,将@Spy更改为@Mock或更改stubing都可以解决问题。

谢谢!我将注释更改为Mock,它解决了问题!:)谢谢,但不幸的是,它没有解决这个问题:(我将Spy注释更改为Mock,然后它成功了。
  @Before public void initMocks() {
       MockitoAnnotations.initMocks(this);
   }