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