gpt4 book ai didi

java - Mockito 空指针与 TypedQuery?

转载 作者:行者123 更新时间:2023-12-02 03:26:10 27 4
gpt4 key购买 nike

我正在使用 Mockito 来模拟 Java 持久性查询的结果集:

被 mock 的代码:

 public void queryMethod(String name){
List<Person> result = persistence.entityManager().createQuery(
"Select p from Person p +
" where p.name= :uniqueId" , Person.class)
.setParameter("name", name)
.getResultList();

}

测试代码:

String name  = "anyName";
Person person = mock(Person.class);
List<Person> personList = new ArrayList<>();
personList.add(person);

TypedQuery query = mock(TypedQuery.class);
when(entityManager.createQuery(anyString(), Matchers.<Class<Object>>anyObject())).thenReturn(query);
when(query.setParameter(1, name)).thenReturn(query);
when(query.getResultList()).thenReturn(personList);

我在线上遇到空指针错误:

List<Person> result = persistence.entityManager().createQuery(

这可能是什么原因造成的?

最佳答案

您的错误在这里:

when(query.setParameter(1, name)).thenReturn(query);

应该是

when(query.setParameter("name", name)).thenReturn(query);

事实上,在您的请求中,您调用的是 .setParameter("name", name) 而不是 .setParameter(1, name),因此您不会模拟正确的方法,并且默认情况下,非模拟方法将返回 null,这就是您获得 NPE 的原因。

无论如何,这似乎不是正确的方法,因为它很容易出错,因为您需要将太多的测试用例与实现结合起来,您应该将查询移动到专用方法中,然后模拟该方法。

我们应该有这样的东西:

public List<Person> findByName(String name) {
return persistence.entityManager().createQuery(
"Select p from Person p +
" where p.name= :uniqueId" , Person.class)
.setParameter("name", name)
.getResultList();
}

然后您将能够模拟此方法,如下所示:

Person person = mock(Person.class);
List<Person> personList = new ArrayList<>();
personList.add(person);

MyDAO dao = mock(MyDAO.class);
when(dao.findByName(name)).thenReturn(personList);

关于java - Mockito 空指针与 TypedQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38849592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com