我有一些休眠方法,当我测试它们时,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
答案 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));
}
现在,我们模拟外部/框架资源(SessionFactory
,Session
,Query
)并手动管理数据。