1.在单元测试总结之前首先要明白几个容器的概念
(1)Spring容器:用来管理dao和service成的声明周期
(2)SpringMVc容器:用来管理controller的生命周期,Spring容器和SpringMvc容器是父与子的关系,control中可以访问Service,但是Service不可以访问Controller
(3)web容器,用来管理Servlet的生命周期,httprequert等对象都是web容器例如tomcat等产生的。
在进行单元测试的时候,我们需要保证测试的独立性,类与类之间不能有依赖,例如service中依赖的dao,我们需要通过mock的方式来获得,这就是我们通常所说的单元测试。
但是在j2ee环境中,我们在测试业务类或控制层的时候,我们需要引入真实的东西,例如将真实的dao装配到service中对serive进行测试,这个时候就叫集成测试,有的地方叫做集成单元测试。我们编写的代码一般都是集成单元测试。这个时候真实的dao对象的产生需要依赖Spring容器,在Spring容器中获得对应的dao对象
传统的集成单元测试获得Spring容器的时候存在下面的不足
在junit单元的测试的setUp方法中获得对应的Spring容器,然后通过容器手工获得对应的bean对象
但是上面的方法存在一个很严重的问题,会让Spring容器被初始化多次,按照Junit框架运行的原理,调用一次test测试方法就会将当前的测试类实例化一次,上面调用了
两次测试方法,就会将当前的测试类实例两次,就会调用两次setUp方法,让Spring容器被加载两次,导致Spring容器被初始化多次。
为了解决上面存在的问题,Spring为我们提供了下面的的框架解决单元测试过程中让Spring容器被初始化多次的问题。那就是Spring-testContext框架,这个框架可以解决让
Spring容器被多次初始化的问题
1、在J2EE中进行单元测试的时候。
引入了Spring-testContext框架,在框架中引入了Spring容器,让单元测试运行在Spring容器中,让Spring容器来管理我们的对象,例如测试Sevice的时候,通过autowire来引入dao
3、对Servlet进行单元测试
这个时候就涉及到web容器内单元测试,还是web容器外单元测试
容器内单元测试就是将应用部署到真实的容器中进行单元测试,例如常见的catus整合jetty进行容器内单元测试
在容器内进行单元测试最大的问题就是web容器的启动速度很慢,tomcat启动需要5秒。weblogic启动需要30秒。
第二钟方法就是在容器外进行单元测试,使用mock的方式来模拟httprequest 、servlet等对象,这个时候Spring TestContext给我们提供了Spring MVC框架,该框架可以模拟客户端的所有请求,完成容器外的单元测试,运行效率超级高。
1. 为Controller编写测试,不需要应用服务器环境
2. 为Service编写测试,不需要应用服务器环境
Spring为我们提供了一个测试套件Spring-test,与JUnit结合,可以在运行测试时启动IoC容器测试Service,数据库,也可以在脱离web容器的环境下模拟http请求测试Controller,甚是给力。
测试Controller
当我们编写完一个Controller后,常规的测试方式就是部署运行应用,然后观察运行效果。如果想要编写测试,也要用Mock对象模拟请求参数,模拟HttpSession,特别麻烦。现在spring-test为我们提供了一个更加优雅的测试方式。例如,要测试下面的Controller:
@RequestMapping(value = {"/", "/shop"}, method = RequestMethod.GET)
public String home() {
return "index";
}
不清楚的请书籍:
在精通spring 2.x 企业应用开发详解一书中指出
在精通spring 3.x 企业应用开发详解一书中指出
在精通spring 4.x 企业应用开发详解一书中指出