测试休眠方法时,Mockito始终返回NULL

时间:2019-10-09 04:29:48

标签: java hibernate testing junit mockito

我有一些休眠方法,当我测试它们时,mockito总是返回null而不是期望值

这是我的休眠方法

@Autowired
private SessionFactory sessionFactory;

public StudentDAO() {

}
public List<StudentDetail> listStudentDetail() {
    String hql = "Select new " + StudentDetail.class.getName() //
            + "(s.studentid,s.name,s.address) " //
            + " from " + Student.class.getName() + " s ";
    Session session = this.sessionFactory.getCurrentSession();
    Query<StudentDetail> query = session.createQuery(hql, StudentDetail.class);
    List<StudentDetail> list =null;
    list = query.getResultList();
    return list;
}

这是我的测试方法

@Mock
SessionFactory sessionFactory;
@Mock
Query query;
@Mock
Session session;
@Mock
List<StudentDetail> list;
@InjectMocks
private StudentDAO studentDAO ;

// Test get method

@Test
public void getListStudentTest() {
    StudentDetail sd1 = new StudentDetail(1, "A", "X");
    Mockito.when(query.getResultList()).thenReturn(list);
    Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
    Mockito.when(session.createQuery(ArgumentMatchers.anyString())).thenReturn(query);
    Mockito.verify(sessionFactory.getCurrentSession());
    Mockito.verify(session.createQuery(ArgumentMatchers.anyString(),ArgumentMatchers.anyObject() ));
    Mockito.verify(query.getResultList());

    Assert.assertEquals(sd1, studentDAO.listStudentDetail().get(0));
}

当我运行我的Web应用程序时,studentDAO.listStudentDetail()通常返回true值,但是在测试方法中,它总是返回null

2 个答案:

答案 0 :(得分:2)

这里

Assert.assertEquals(sd1, studentDAO.listStudentDetail().get(0));

studentDAO.listStudentDetail()返回一个模拟列表。您没有嘲笑其.get方法。因此,它默认返回null。 您应该修改assertEquals支票:

Assert.assertEquals(list, studentDAO.listStudentDetail());

(您根本不需要sd1对象)


您还没有正确使用verify。您应该这样做:

Mockito.verify(sessionFactory).getCurrentSession();
Mockito.verify(session).createQuery(ArgumentMatchers.anyString());
Mockito.verify(query).getResultList();

(请注意.之前的右括号)

答案 1 :(得分:0)

看看您模拟的方法

Mockito.when(session.createQuery(ArgumentMatchers.anyString())).thenReturn(query);

和您调用的方法:

 Query<StudentDetail> query = session.createQuery(hql, StudentDetail.class);

它们具有不同的错误率(参数数量)。您使用一个参数模拟方法,然后使用两个参数进行调用。模拟,当不知道返回什么时,返回null


编辑:

@Mock
List<StudentDetail> list;

//....

Mockito.when(query.getResultList()).thenReturn(list);

如何初始化和填充列表?顺便说一句,该代码的更好的版本(在我看来):

@Mock
SessionFactory sessionFactory;
@Mock
Query query;
@Mock
Session session;

@InjectMocks
private StudentDAO studentDAO ;

// Test get method

@Test
public void getListStudentTest() {
    StudentDetail sd1 = new StudentDetail(1, "A", "X");

    List<StudentDetail> list = new ArrayList<>();
    list.add(sd1);

    Mockito.when(query.getResultList()).thenReturn(list);
    Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
    Mockito.when(session.createQuery(ArgumentMatchers.anyString())).thenReturn(query);
    Mockito.verify(sessionFactory.getCurrentSession());
    Mockito.verify(session.createQuery(ArgumentMatchers.anyString(),ArgumentMatchers.anyObject() ));
    Mockito.verify(query.getResultList());

    Assert.assertEquals(sd1, studentDAO.listStudentDetail().get(0));
}

现在,我们模拟外部/框架资源(SessionFactorySessionQuery)并手动管理数据。