【发布时间】:2019-03-07 17:31:46
【问题描述】:
我访问了很多博客和网站,以了解如何使用 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()
{
}
}
我的用户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();
}
}
}
我的 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 而不是使用 Spring Data JpaRepository 自动为您完成这一切是否有特定的原因?
-
但是当我使用 JpaRepository 执行此操作时,是否可以更简单地测试 Service 类,然后我将在其中使用 CRUD 操作?我还看到了 2 个变体:CrudRepository 和 JpaRepository。 2.另外,你将如何测试CRUD操作呢?
-
(2) 通常,您不测试框架代码——您相信 Spring Data 开发人员已经对其进行了测试并使其正常工作。 (1) 您可以阅读有关详细信息的文档,但 JpaRepository 更具体,尤其适用于您使用多个 Spring Data 后端(例如,JPA 和 MongoDB)并且需要明确路由查询的位置。 (并且存储库抽象使测试变得非常容易,因为您可以直接模拟存储库。)