2016-08-09 5 views
-1

私は、Java永続クエリの結果セットを模擬するためにMockitoを使用しています:TypedQueryでMockitoヌルポインタ?

コードが嘲笑されている:

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

可能な重複:その後、あなたは次のようにこの方法を模擬することができるようになります

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

を?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – GhostCat

+0

@GhostCatどういう意味ですか?説明してください – java123999

+0

私は少し速すぎたかもしれません。しかし、ポイントは:その1行には、NPEを与えることができる少なくとも2つのオブジェクトがあります。 A)*永続性* B)entityManager()の呼び出しの結果。C)次にcreateQuery()の結果。長い話をすると、それぞれの呼び出しがヌルでないものを返すことを確認する必要があります。 – GhostCat

答えて

2

あなたのバグはここにある:

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

それはあなたの要求に実際

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

する必要がありますあなたが嘲笑以外ない.setParameter(1, name)ので、あなたは右の方法を模擬していないと、デフォルトで.setParameter("name", name)を呼び出しますメソッドはnullを返します。これがNPEを取得する理由です。

いずれにしても、テストケースを実装にあまりにも多く結合する必要があるため、エラーが起こりやすいため、適切なアプローチではないようです。むしろ、専用のメソッドでクエリを移動し、 。

私たちのようなものが必要です:NullPointerExceptionがある、と私はそれをどのように修正すればどのような[の

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

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