依赖注入的测试优势

时间:2016-03-20 03:14:33

标签: java spring junit dependency-injection

我最近开始学习Spring和依赖注入的概念。我对 Junit 测试和模拟概念有一些了解,但仍然无法理解依赖注入提供的特定测试相关优势。< / p>

例如,我通过以下方式实例化Triangle类: -

Triangle triangle1 = new Triangle();

现在使用Spring进行依赖注入,我按照以下方式执行

Triangle triangle2 = (Triangle) beanFactory.getBean("triangle");

假设Triangle类有一些需要测试的方法。测试triangle1triangle2

的不同方法是什么?

1 个答案:

答案 0 :(得分:1)

使用Spring,您不会从工厂中明确查找bean。相反,容器在使用之前初始化bean,因此您的代码不必调用容器本身。

Web应用程序中常见的是Web控制器处理将Web请求和帖子转换为业务逻辑调用,处理事务处理业务逻辑的服务,以及使用每个执行简单查询或更新的方法的数据访问对象。 (所有这些通常都是无状态的,唯一的实例成员是对其他无状态对象的引用,并且它们可以同时执行多个请求。)每个层中的对象依赖于下一个较低层中的对象,并且Spring在启动时将所有这些对象连接在一起

如果我有一个使用服务的控制器,Spring会创建控制器和服务,并将服务连接到控制器。应用程序代码从不调用bean工厂。

public class SomeWebController {
    private MyBusinessLogicService  myBusinessLogicService;

    public SomeWebController(MyBusinessLogicService myBusinessLogicService) {
        this.myBusinessLogicService = myBusinessLogicService;
    }
    ...
}

单元测试不必了解容器。测试可以通过插入模拟其依赖项来设置被测试对象,方法是创建这些依赖项并直接调用setter方法,或者通过创建测试配置并在插件中插入模块。

如果我有一个不使用Spring的控制器,并且它使用它的构造函数直接实例化服务,那么用模拟代替服务就更难了。我必须做一些像refactor这样的事情来为服务引入一个工厂方法,并在测试中覆盖它以返回一个模拟。这将在测试中引入样板代码,我必须将我正在测试的类子类化,并且我的覆盖范围中存在间隙,其中未执行重写的工厂方法。