2016-07-02 10 views
0

私はmockitoを使用してテストを開始しています。 まず、CriteriaQueryである.findAll()をテストする必要があります。CriteriaQuery返品nullpointerexception mockito

UserFacadeは、このfindAllを持つAbstractFacadeを継承しています。

public abstract class AbstractFacade<T> { 

    private Class<T> entityClass; 

    public AbstractFacade(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    .... 

    public List<T> findAll() { 
     CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
     CriteriaQuery<T> cq = cb.createQuery(entityClass); 
     Root<T> rootEntry = cq.from(entityClass); 
     CriteriaQuery<T> all = cq.select(rootEntry); 
     TypedQuery<T> allQuery = em.createQuery(all); 
     return allQuery.getResultList(); 
    } 
    ... 

私のテスト:

私はこの見た私のテストデバッグ
@RunWith(MockitoJUnitRunner.class) 
public class UserFacadeTest { 

    public UserFacadeTest() { 
    } 
    @Mock 
    private EntityManager mockedEM; 
    @Mock 
    private CriteriaQuery mockedCQ; 
    @Mock 
    private CriteriaQuery mockedCQAll;  
    @Mock 
    private Root mockedRoot; 
    @Mock 
    private CriteriaBuilder mockedCB; 
    @Mock 
    private TypedQuery mockedTQ; 
    private UserFacade userFacade; 
    List<User> userList= new ArrayList<>(); 

    @Before 
    public void setUp() { 
     userFacade=new UserFacade(); 
     userFacade.setEm(mockedEM); 
     when(mockedEM.getCriteriaBuilder()).thenReturn(mockedCB); 
     when(mockedCB.createQuery()).thenReturn(mockedCQ); 
     when(mockedCQ.from(User.class)).thenReturn(mockedRoot); 
     when(mockedCQ.select(mockedRoot)).thenReturn(mockedCQAll); 
     when(mockedEM.createQuery(mockedCQAll)).thenReturn(mockedTQ); 
     when(mockedTQ.getResultList()).thenReturn(userList); 
    } 

    @Test 
    public void testFindAll() { 
     System.out.println("findAll"); 
     User user = new User(1, "username", "password", "email", new Date()); 
     userFacade.create(user); 
     verify(mockedEM, times(1)).persist(any()); 
     userList.add(user); 
     //next line cause NullPointerException 
     List list=userFacade.findAll(); 

     assertTrue("Should return 1", 1==list.size()); 

    } 

:そう、私は間違って通過 "User.class" だと思う

.... 

    public List<T> findAll() { 
     CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
     CriteriaQuery<T> cq = cb.createQuery(entityClass); //cq is null!!!! 
     Root<T> rootEntry = cq.from(entityClass); //cq is null!!!! 
     CriteriaQuery<T> all = cq.select(rootEntry); 
     TypedQuery<T> allQuery = em.createQuery(all); 
     return allQuery.getResultList(); 
    } 
    ... 

を...私はしましたこれも偽の?どうやって?

+0

にそれを変更しようとあなたが嘲笑EMを使用することを期待しているようですか? – SMA

+0

私はmockedEMを設定したので、getEntityManagerはmockedEMを返します。 – Marco

答えて

1

私が見てきたように、正しいものを嘲笑しているわけではありません。

when(mockedCB.createQuery()).thenReturn(mockedCQ); 

mockedCB.createQuery()が呼び出されたときに、その後、mockedCQが返されます。 しかし、あなたのコードには同じ方法ではないcb.createQuery(entityClass);があります。 だから、あなたがgetEntityManagerを呼び出して、テストごとにされている

when(mockedCB.createQuery(any())).thenReturn(mockedCQ); 
+0

ありがとう!私はちょうどあなたが見たものを逃した...ありがとう – Marco