如何模拟和单元测试 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(查询);