繁体   English   中英

Junit测试调用Dao类的Business类

[英]Junit test the Business class that invokes Dao class

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

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

我是Junit和TDD的新手。 因此,如果我的理解有误,请指导我或解决此问题。

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

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

public class YourService {
    private final YourDAOInterface dao;

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

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

我建议在执行其他任何操作之前将其重构为可测试的状态。 如果设计确实像您所说的那样坏,那么现在可以通过一种方法为特定的类编写有用的Test。

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

我们称其为单元测试是有原因的-因为我们仅测试一个单元-而不是集成测试。 我们在这里不混淆各层。

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

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

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

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

希望能帮助到你 !!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM