调用模拟类的方法时出现NullPointerException

时间:2013-12-15 18:18:35

标签: java unit-testing mockito

当我为下面的类运行单元测试时,我收到了注释所指示的NullPointerException。我觉得我在这里缺少一些简单的东西。我正在使用Mockito 1.9.5并且没有任何模拟方法是最终的。

public class UserBOTest {

    @Mock private IUserDAO userDao;

    @InjectMocks private IUserBO userBo = new UserBO();

    @Test
    public void testRegister() throws DBException {
        when(userDao.doesEmailExist(any(String.class))).thenReturn(false); //NULLPOINTEREXCEPTION HERE
        when(userDao.saveOrUpdate(Matchers.<User>any())).thenReturn(true);
        Assert.assertEquals(userBo.registerUser("user", "pwd", "email", ""), Constants.General.OK);
    }

}

堆栈追踪:

java.lang.NullPointerException
    at com.dbcreator.services.bo.UserBOTest.testRegister(UserBOTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

3 个答案:

答案 0 :(得分:3)

您的userDao为空。您需要通过执行

告诉Mockito实际注入测试中声明的模拟
@Before
public void prepare() {
    MockitoAnnotations.initMocks(this);
}

请记住,注释只是元数据。他们什么都不做。一个工具可以使用它们来做一些事情。在这种情况下,此工具为MockitoAnnotations.initMocks(),它读取测试对象的字段,检查注释以及创建/注入模拟。

答案 1 :(得分:3)

由于看起来你的模拟对象本身是null,我猜你错过了一些初始化。

为了使用@Mock注释,您需要在测试或测试运行器中的某个位置,您需要进行初始化模拟注释的调用:

MockitoAnnotations.initMocks(testClass);

如果您使用MockitoJUnitRunner,则应该为您完成此操作。

答案 2 :(得分:2)

您的userDao可能为null,因为您缺少以下内容:

 MockitoAnnotations.initMocks(this);

以上调用@Mock注释工作所需。请参阅:http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#9