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?
Sie rufen getEntityManager und nach Ihrem Test scheint Sie verspottet EM verwenden erwarten? – SMA
ich setted mockedEM, also wird getEntityManager mockedEM zurückgeben, richtig? – Marco