2016-08-09 28 views
-1

我使用的Mockito嘲笑结果集的Java持久性查询:Mockito空指针与TypedQuery?

代码被嘲笑:

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(

什么可能导致这种情况?

+0

的可能的复制[什么是空指针异常,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – GhostCat

+0

@GhostCat你是什么意思?请解释 – java123999

+0

也许我有点太快了。但重点是:在这一行中,至少有两个对象可以给你NPE。 A)*持久性* B)调用entityManager()的结果C),然后是createQuery()的结果。长话短说:你必须确保每个这样的调用都返回非空的东西。 – GhostCat

回答

2

你的错误是在这里:

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);