【问题标题】:CriteriaQuery return nullpointerexception mockitoCriteriaQuery return nullpointerexception mockito
【发布时间】:2016-07-02 09:12:35
【问题描述】:

我正在使用 mockito 开始我的测试。 首先我需要测试 .findAll() 是一个 CriteriaQuery...

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

    }

调试我的测试我看到了这个:

    ....

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

所以我认为我通过“User.class”是错误的......我也要模拟这个???怎么样?

【问题讨论】:

  • 您正在调用 getEntityManager,根据您的测试,您似乎希望使用模拟 EM?
  • 我设置了 mockedEM,所以 getEntityManager 会返回 mockedEM,对吧?

标签: java testing mockito


【解决方案1】:

如我所见,您没有正确地嘲笑它。

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

因此,当调用mockedCB.createQuery() 时,将返回mockedCQ。 但是,在您的代码中,您有 cb.createQuery(entityClass); 这不是同一种方法。 所以尝试将其更改为

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

【讨论】:

  • 非常感谢!我只是错过了你所看到的......谢谢你
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
相关资源
最近更新 更多