2016-09-16 68 views
0

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

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

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

+0

答案很好,只是想补充一点,你可能想看看在测试期间是否可以连接到这些现代内存数据库中的一个。据我所知,它们非常适合单元测试,并且可以让您不必存储数据库连接。 –

回答

0

我建议在做任何事情之前重构为可测试状态。如果设计真的如你所说的那么糟糕,现在有办法为特定的课程编写有用的测试。

1

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

注入DAO到您的服务类没有任何框架可能是构造函数注入,即通过DAO实例为您服务类的构造函数的最简单方法。

public class YourService { 
    private final YourDAOInterface dao; 

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

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

0

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

我们把它叫做是有原因的单元测试 - 因为我们只测试单元 - 它不是一个集成测试。我们不在这里混合图层。

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

通过使用嘲讽的框架,您提供相同的数据业务功能DAO层应该从数据库切换和你完全不执行DAO层。除了JUnit之外,您还需要这些模拟API来正确编写单元测试。

你的问题有意见建议关于使用内存数据库和框架(Apache的DbUnit和H2 DB在那里),但DAO层,而不是对业务层编写单元测试时,你会需要这些。

正如其他答案中所建议的,总是推荐重构和编码可测试。

希望它有帮助!

+0

是的,我明白模拟框架应该用来模拟DAO对象。我必须修改设计,以便可以使用模拟,因为当前的设计没有界面和实现。你可以参考一下我可以找到DAO类的嘲笑的链接吗? – Anand

+0

您需要显示服务层和道路层代码的示例。如果您的DAO对象是服务层的依赖项,则首先创建该dao依赖项的模拟对象,然后使用该模拟对象返回将由服务层使用的测试数据。实际的语法因API而异。你决定使用哪个模拟API吗? –