如何模拟和单元测试 javax.persistence.EntityManager 和 javax.persistence.Query?获取 NullPointerException
How to mock and unit test javax.persistence.EntityManager and javax.persistence.Query? Getting NullPointerException
正在测试方法。我遇到了需要向其传递查询的实体管理器。
StringBuilder jpqlQuery=new StringBuilder("select Distinct s.modelCode from Model s where 1=1");
Query query = entityManager.createQuery(jpqlQuery.toString());
if(myModel != null ) {
jpqlQuery.append(" and s.name = :name");
}
if(myModel != null){
query.setParameter("name", myModel.getFirstName());
}
我可以进入 jpqlquery.append 条件但无法进入 query.setParameter。
我在
Query query = entityManager.createQuery(jpqlQuery.toString());
下面是我的测试方法:
@Test
public void testGetModelNameDetails() {
List<String> results = new ArrayList<>();
ModelDTO myModel = Mockito.mock(ModelDTO.class);
StringBuilder jpqlQuery = new StringBuilder("select Distinct s.modelCode from Model s where 1=1");
when(myModel.getFirstName()).thenReturn("Downtown");
when(em.createQuery(jpqlQuery.toString())).thenReturn(query);
when(query.getResultList()).thenReturn(results);
serviceImpl.getNameDetails(myModel);
}
调试时在第 when(em.createQuery(jpqlQuery.toString())).thenReturn(query);
行,我可以看到查询对象是模拟查询对象。
但是在被测试的方法内部,即
在这一行:Query query = entityManager.createQuery(jpqlQuery.toString());
查询对象为空。
因此我在 query.setParameter("name", myModel.getFirstName());
处得到 NullPointerException
在测试开始时 class 我正在模拟 entityManager 和查询
@嘲笑
实体管理器实体管理器;
@Mock
Query query;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
entityManager = Mockito.mock(em.class);
query = Mockito.mock(Query.class);
}
我在这里遗漏了什么或做错了什么?
已解决!
当(entityManager.createQuery(Mockito.anyString())).thenReturn(查询);
正在测试方法。我遇到了需要向其传递查询的实体管理器。
StringBuilder jpqlQuery=new StringBuilder("select Distinct s.modelCode from Model s where 1=1");
Query query = entityManager.createQuery(jpqlQuery.toString());
if(myModel != null ) {
jpqlQuery.append(" and s.name = :name");
}
if(myModel != null){
query.setParameter("name", myModel.getFirstName());
}
我可以进入 jpqlquery.append 条件但无法进入 query.setParameter。
我在
Query query = entityManager.createQuery(jpqlQuery.toString());
下面是我的测试方法:
@Test
public void testGetModelNameDetails() {
List<String> results = new ArrayList<>();
ModelDTO myModel = Mockito.mock(ModelDTO.class);
StringBuilder jpqlQuery = new StringBuilder("select Distinct s.modelCode from Model s where 1=1");
when(myModel.getFirstName()).thenReturn("Downtown");
when(em.createQuery(jpqlQuery.toString())).thenReturn(query);
when(query.getResultList()).thenReturn(results);
serviceImpl.getNameDetails(myModel);
}
调试时在第 when(em.createQuery(jpqlQuery.toString())).thenReturn(query);
行,我可以看到查询对象是模拟查询对象。
但是在被测试的方法内部,即
在这一行:Query query = entityManager.createQuery(jpqlQuery.toString());
查询对象为空。
因此我在 query.setParameter("name", myModel.getFirstName());
在测试开始时 class 我正在模拟 entityManager 和查询 @嘲笑 实体管理器实体管理器;
@Mock
Query query;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
entityManager = Mockito.mock(em.class);
query = Mockito.mock(Query.class);
}
我在这里遗漏了什么或做错了什么?
已解决! 当(entityManager.createQuery(Mockito.anyString())).thenReturn(查询);