【问题标题】:How to get a Datasource to be able to test DAO'S classes如何让数据源能够测试 DAO 的类
【发布时间】:2025-12-03 23:50:01
【问题描述】:

我正在寻找一种方法来测试我的 Dao 课程。

我的一个班级有这样的数据源:

public class OrderEJB implements OrderEjbLocal{

    @Resource(mappedName = "java:jboss/datasources/MyDS")
    private DataSource dataSource;

    @Inject
    @DataAccessObject
    private UserDAO userDAO;

   @Override
    public List<Activity> activityList() {

        try (Connection connection = dataSource.getConnection();) {

            return this.userDAO.findAllActivities(connection);

        } catch (SQLException e) {

            log.error("error");
            throw new RuntimeException(e);
        }
    }

}

然后我有类 UserDAOImpl 和方法

 public List<Activity> activityList(Connection con)

如何测试 UserDAOImpl?我需要像 mockito、jmock、easymock 这样的东西吗?另外,运行我的 Junit 测试时是否需要运行服务器?或者有没有办法做到这一点?

谢谢

【问题讨论】:

标签: java junit jboss mockito jboss-arquillian


【解决方案1】:

您可以使用 Mockito 模拟您传递给 UserDAOImpl 的 activityList 方法的 Connection,如下所示:

UserDAOImpl testInstance = ...;  // Not sure how you do this
Connection mockedConnection = mock(Connection.class);

// Business method
testInstance.activityList(mockedConnection);

// Asserts
verify(mockedConnection).prepareStatement("select * from dual");  // Or whatever it is that you need to verify

服务器根本不需要运行。当您的 UserDAOImpl 调用 Connection 上的方法时,它实际上是在执行由 Mockito 生成的代码,进而跟踪您已执行的内容以支持您在测试方法中更深入地编写的验证方法。 您的 UserDAOImpl 很可能也会对它从 Connection#prepareStatement(String) 获得的 PreparedStatement 做一些事情,因此也需要模拟它。 请注意,您创建的模拟将自动返回模拟:

mock(Connection.class, Mockito.RETURNS_DEEP_STUBS);

【讨论】: