Mockito всегда возвращает NULL при тестировании метода гибернации - PullRequest
3 голосов
/ 09 октября 2019

У меня есть несколько методов гибернации, и когда я их тестирую, mockito всегда возвращает нулевое значение вместо ожидаемого значения

Это мой метод гибернации

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

Когда я запускаю свое веб-приложение, studentDAO.listStudentDetail() возвращает истинное значение в обычном режиме, но в методе тестирования всегда возвращается ноль

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Здесь

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

(обратите внимание на закрывающую скобку перед .)

0 голосов
/ 09 октября 2019

Взгляните на метод, который вы высмеиваете

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) и вручную управляем нашими данными.

...