Junit测试调用Dao类的Business类

时间:2016-09-16 04:44:15

标签: java unit-testing junit dao

我正在接管一个使用Struts和普通JDBC框架实现的产品。我计划在项目中实施Junit测试,以加快测试速度。仅供参考,该项目尚未投入生产。这仍处于开发阶段,但使用的是非常古老的技术。该项目没有任何接口和相应的实现。像老程序一样,该类直接实例化并使用。所以,不能使用mockito框架。由于存在所有这些限制,我需要将TDD开发到项目中。我不能完全废弃并用新技术开发它。

我的问题是:我正在写一个业务层的junit测试,以检查该方法是否有效。这个商务舱也在打电话给DAO。由于在测试时未创建数据库连接,因此会给出连接错误。如何编写junit测试来仅测试业务层?我是否需要在测试方法中包含DAO连接?如果是,我该如何实现?

我是Junit和TDD的新手。所以,如果我的理解错误或要解决这个问题,请指导我。

3 个答案:

答案 0 :(得分:1)

你能重构你的代码吗?如果是这样,您可以从重构代码开始为您的真实DAO定义DAO接口,实现新创建的接口的模拟版本,并在单元测试中将它们注入您的服务。

在没有任何框架的情况下将DAO注入服务类的最简单方法可能是构造函数注入,即将DAO实例传递给服务类构造函数。

public class YourService {
    private final YourDAOInterface dao;

    public YourService(YourDAOInterface dao) {
        this.dao = dao;
    }
}

这里构造函数dao的参数可以是真正的DAO,也可以是用于测试的模拟实现(需要使这两个DAO实现相同的接口YourDAOInterface)。

答案 1 :(得分:0)

我建议在做任何其他事情之前重构为可测试状态。如果设计真的像你说的那样破碎,现在就可以为特定的类编写一个有用的测试。

答案 2 :(得分:0)

我想,你写的第一段与你最后在第二段中提出的问题无关。

我们称之为单元测试是有原因的 - 因为我们只测试一个单元 - 它不是集成测试。我们不会在这里混淆图层。

如果您的目标是仅测试业务层 - 您只测试业务层,并模拟下面的所有内容(如DAO等)。因此,使用一些模拟框架(Mockito,PowerMock,JMockit等)为您的业务层代码提供数据,并假设您的DAO层是正确的。

通过使用模拟框架,您可以向业务功能提供相同的数据,DAO层应该从数据库切换,而您根本不执行DAO层。除了JUnit之外,您还需要这些模拟API才能正确编写单元测试。

对您的问题的评论建议使用内存数据库和框架(Apache DBUnit和H2 DB都在那里)但是在为DAO层编写单元测试而不是业务层时需要这些。

正如其他答案中所建议的那样,始终建议重构和使代码可测试。

希望它有所帮助!!