2016-07-02 18 views
0

Ich beginne meinen Test mit Mockito. zuerst muss ich testen .findAll() das ist ein CriteriaQuery ...Criteriaquery zurück nullpointerexception mockito

UserFacade erweitert AbstractFacade, die diese findAll haben.

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

Mein Test:

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

    } 

Debuggen von meinem Test habe ich diesen:

.... 

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

so ich glaube, ich bin falsch Passing "User.class" ... ich habe das auch zu verspotten ??? Wie?

+0

Sie rufen getEntityManager und nach Ihrem Test scheint Sie verspottet EM verwenden erwarten? – SMA

+0

ich setted mockedEM, also wird getEntityManager mockedEM zurückgeben, richtig? – Marco

Antwort

1

Wie ich sehen kann, verspotten Sie es nicht richtig.

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

Also, wenn mockedCB.createQuery() aufgerufen wird, dann wird mockedCQ zurückgegeben werden. Aber dann, in Ihrem Code haben Sie cb.createQuery(entityClass);, die nicht die gleiche Methode ist. So versuchen, es zu

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

Vielen Dank! Ich habe nur vermisst, was du gesehen hast ... Danke – Marco

Verwandte Themen