java - 使用mockito测试Hibernate DAO方法

标签 java spring hibernate get

我访问了很多博客和网站来了解如何使用 Mockito 在 Hibernate 中测试我的 DAO 方法,但我还没有找到任何可以帮助我编写代码的具体示例。我发现我必须使用集成测试而不是 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()
{

}
}

我的 UserDAO:

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

}
}

我的 GeneralDAO:

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

最佳答案

您所读到的有关测试 DAO 的内容是正确的方法。
不要使用 Mockito 测试 DAO/存储库层。

您不想编写一个断言确实调用了语句流的单元测试:

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

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

// commit transaction
transaction.commit();

//closing session
session.close();

编写这种测试意味着主要编写mock来描述流程。
没有值(value),因为它在逻辑/行为方面没有检查任何内容。
同样,断言查询也是无用的。您可以在 DAO 中编写“SELECT SELECT SELECT”作为查询,如果您依赖于检查查询文本,您的测试仍然可以成功。

您使用 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
}

关于java - 使用mockito测试Hibernate DAO方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55049744/

相关文章:

java - mirrorEnds 谜题没有给出任何错误线索

java - 如何使用 O(logN) 对具有 n 个元素的优先级队列进行排序?

java - Mongodb 内部使用 AggregationOperation :Error [The 'cursor' option is required, 在 java spring 中加入,除了带有 explain 参数的聚合]

java - 获取 org.hibernate.AnnotationException : Unknown entity name: int

java - JPQL IS NOT NULL 返回带有 NULL 的对象

java - 谷歌API翻译Java

java - 将三个表内连接到 java DTO

spring - org.hibernate.QueryException : Space is not allowed after parameter prefix ':'

java - 从 JpaRepository 检索对象后,延迟加载在简单的 Hibernate/Spring 启动示例中不起作用

java - Hibernate更新/删除一对多集合