Java 模拟QueryBuilder时的NullPointerException

Java 模拟QueryBuilder时的NullPointerException,java,nullpointerexception,mocking,mockito,query-builder,Java,Nullpointerexception,Mocking,Mockito,Query Builder,问题: when(academicjpadao.getEntityManager().createQuery(cq).getSingleResult()).thenReturn(academic); 我正在尝试使用Mockito创建一个测试。此测试模拟QueryBuilder并尝试验证是否一切正常。 但是我得到了“java.lang.NullPointerException”。似乎有些东西还没有初始化,但我看不出它是什么 代码: @RunWith(MockitoJUnitRunner.Stri

问题:

when(academicjpadao.getEntityManager().createQuery(cq).getSingleResult()).thenReturn(academic);
我正在尝试使用Mockito创建一个测试。此测试模拟QueryBuilder并尝试验证是否一切正常。 但是我得到了“java.lang.NullPointerException”。似乎有些东西还没有初始化,但我看不出它是什么

代码:

@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class AcademicJPADAOTest {

    @Mock
    private EntityManager entityManager;
    @Mock
    private CriteriaBuilder cb;
    @Mock
    private CriteriaQuery<Academic> cq;
    @Mock
    private Root<Academic> root;

    @InjectMocks
    AcademicJPADAO academicjpadao;

    private String passwdcode = "83997689-22b6-4a7e-a801";


    @Test
    public void retrieveByPasswordCodeTest() throws PersistentObjectNotFoundException, MultiplePersistentObjectsFoundException {

        Academic academic = new Academic();

        when(entityManager.getCriteriaBuilder()).thenReturn(cb);
        when(cb.createQuery(Academic.class)).thenReturn(cq);
        when(cq.from(Academic.class)).thenReturn(root);
        when(cq.where(cb.equal(root.get(Academic_.passwordCode), passwdcode))).thenReturn(cq);

        when(academicjpadao.getEntityManager().createQuery(cq).getSingleResult()).thenReturn(academic);

        academicjpadao.retrieveByPasswordCode(passwdcode);

        verify(entityManager, times(1)).getCriteriaBuilder();

    }
}

可能您的
academicjpadao
没有正确地注入此部分:

 @InjectMocks
 AcademicJPADAO academicjpadao;
因此,请使用
MockitoAnnotations.initMocks
来启动
@Mock
@InjectMocks
对象。因此,您必须将此方法添加到类中:

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

可能您的
academicjpadao
没有正确地注入此部分:

 @InjectMocks
 AcademicJPADAO academicjpadao;
因此,请使用
MockitoAnnotations.initMocks
来启动
@Mock
@InjectMocks
对象。因此,您必须将此方法添加到类中:

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

当(..)中的值未匹配时,将出现Null指针。请检查下面的答案
academyjpadao.getEntityManager()。createQuery(cq)
返回Null-没有为
entityManager.createQuery()指定任何行为。
getSingleResult
的后续调用以NPE结束。这有什么奇怪的?@Jaadu我可以想象,问题是,什么是匹配小姐?haha@Lesiak你是说我必须把它分成两个不同的部分吗?一个指定
entityManager.createQuery()
的返回,另一个指定
getSingleResult
的结果。当(..)中的值未匹配时,将出现空指针。请检查下面我的答案
academicjpadao.getEntityManager().createQuery(cq)
返回null-没有为
entityManager.createQuery()指定行为。
getSingleResult
的后续调用以NPE结束。这有什么奇怪的?@Jaadu我可以想象,问题是,什么是匹配小姐?haha@Lesiak你是说我必须把它分成两个不同的部分吗?一个指定返回
entityManager.createQuery()
,另一个指定结果
getSingleResult
?谢谢,但我没有工作。因为我正在使用“@RunWith(MockitoJUnitRunner.StrictStubs.class)”,它已经初始化了MocksThanks,但我没有工作。因为我正在使用“@RunWith(MockitoJUnitRunner.StrictStubs.class)”,它已经初始化了mock