Тестирование методов DAO Hibernate с помощью mockito - PullRequest
1 голос
/ 07 марта 2019

Я посетил множество блогов и веб-сайтов, чтобы узнать, как я могу тестировать свои методы DAO в Hibernate с Mockito, но я не нашел конкретного примера, который мог бы помочь мне с моим кодом.Все, что я обнаружил, это то, что я должен использовать интеграционный тест вместо теста JUnit, но я действительно не знаю, как это сделать с моим кодом.

ВОПРОС: Как я могу проверить мойМетоды DAO настолько хороши, насколько это возможно?

МОЙ КОД:

Мой тест только с частью mockito:

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class UserDAOTest
{

@Mock
private UserDAO userDAO;

@Before
public void setUp()
{
    MockitoAnnotations.initMocks(this);
}

@Test
public void testAddUser_AddsNewUser()
{

}

@Test
public void testDeleteUser_DeletesUser()
{

}


@Test
public void testGetUser_FetchUser()
{

}

@Test
public void testGetUsers_FetchesAllUsers()
{

}
}

Мой пользовательDAO:

import Hibernate.HibernateUtil;
import Hibernate.Models.User;
import org.hibernate.HibernateException;
import org.springframework.stereotype.Repository;
import org.hibernate.Session;
import org.hibernate.Transaction;
import java.util.List;

//@Transactional
@Repository
public class UserDAO extends GeneralDAO
{

public void addUser(User user)
{
    add(user);
}


/**
 * Deletes a user from the database based on the userID
 * @param userID
 */

public void deleteUser(int userID)
{
    User user = new User();
    delete(userID, user);
}


public User getUser(int userID) throws Exception
{
    Transaction transaction = null;
    User user = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession()) 
{
        // start a transaction
        transaction = session.beginTransaction();

        // Gets the user object
        user = session.get(User.class, userID);

        // commit transaction
        transaction.commit();

        //closing session
        session.close();

        return user;

    } catch (Exception e) {
        if (transaction != null) {
            transaction.rollback();
        }
        e.printStackTrace();
        return user;
    }
}


public List<User> getUsers() throws HibernateException, Exception
{
    try(Session session = HibernateUtil.getSessionFactory().openSession()){
        return session.createQuery("FROM User", User.class).getResultList();
    }

}
}

Мой генералДАО:

import Hibernate.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.stereotype.Repository;

//@Transactional
@Repository
public class GeneralDAO
{
public void add(Object obj)
{
    Transaction transaction = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession())
    {
        // start a transaction
        transaction = session.beginTransaction();

        // add the user object
        session.save(obj);

        // commit transaction
        transaction.commit();

        //closing session
        session.close();


    } catch (Exception e)
    {
        if (transaction != null)
        {
            transaction.rollback();
        }
        e.printStackTrace();
    }
}

public void delete(int userID, Object obj)
{
    Transaction transaction = null;
    try (Session session = HibernateUtil.getSessionFactory().openSession())
    {

        obj = session.load(obj.getClass(), userID);

        // start a transaction
        transaction = session.beginTransaction();

        //deleting the user from the db
        session.delete(obj);

        // commit transaction
        transaction.commit();

        //closing session
        session.close();


    } catch (Exception e)
    {
        if (transaction != null)
        {
            transaction.rollback();
        }
        e.printStackTrace();
    }
}
}

1 Ответ

1 голос
/ 07 марта 2019

То, что вы читаете о тестировании DAO, является правильным способом.
Не тестируйте с Mockito слой DAO / репозитория.

Вы не хотите писать модульный тест, который утверждает, что поток операторов действительно был вызван:

// start a transaction
transaction = session.beginTransaction();

// add the user object
session.save(obj);

// commit transaction
transaction.commit();

//closing session
session.close();

Написание такого вида теста означает написание в основном макета для описания потока.
Нет значения, потому что он проверяет ничего с точки зрения логики / поведения.
Точно так же утверждение запроса бесполезно.Вы можете написать «SELECT SELECT SELECT» как запрос в вашем DAO, и ваш тест все равно может быть успешным, если вы полагаетесь на проверку текста запроса.

Вы используете Spring.Если вы также используете Spring Boot, вам следует положиться на тестовую секцию @DataJpaTest, которая фокусируется на тестировании компонентов доступа к данным.
В противном случае, не беспокойтесь.Мы сделали это до Spring Boot.Таким образом, мы все еще можем это сделать.
Сконфигурировать базу данных в памяти (например, H2) для вашего теста и очистить / заполнить данные в соответствии с тестируемым методом.
Например:

@Autowired
UserDAO userDAO;

@Test
public void getUser_retrieves_users_added_by_addUser(){
    User addedUser = userDAO.add(new User("foo", "bar"));
    // ... flush data in the database and clear first cache level to avoid cache using
    User expectedUser =  userDAO.get(addedUser.getId());
   // assert the expected User
}

@Before
public void tearDown(){
   // clear data in the database
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...