一. 点睛
测试是开发工作中不可缺少的部分,单元测试只针对当前开发的类和方法进行测试,可以简单通过模拟依赖来实现,对运行环境没有依赖;但是仅仅单元测试是不够的,它只能验证当前类或者方法能否正常工作,而我们想要知道系统的各个部分组合在一起是否能够正常工作,这就涉及到了集成测试。
集成测试一般需要来自不同层的不同对象的交互,如数据库,网络连接,Ioc
容器等。其实我们也经常通过运行程序,然后通过自己操作来完成类似于集成测试的流程。集成测试为我们提供了一种无须部署或运行程序来完成验证系统各部分功能是否能正常协同工作的能力。
Spring
通过Spring TestContext Framework
对集成测试提供顶级支持。它不依赖特定的测试框架,即可使用Junit
,也可使用TestNG
。
基于maven
构建的项目结构默认有关于测试的目录是:src/test/java
(测试代码),src/test/resources
(测试资源),它们区别于src/main/java
(项目源码),src/main/resource
(项目资源)。
Spring
提供了一个SpringJUnit4ClassRunner
类,它提供了Spring TestContext Framework
的功能。通过@ContextConfiguration
来配置Application Context
,通过@ActiveProfiles
确定活动的profile
。
在使用了Spring
测试后,我们前面文章中例子的”运行”部分都可以用Spring
测试来检验功能能否正常运作。
集成测试涉及程序中的各个分层,本节只对简单配置的Application Context
和在测试中注入Bean
做演示。
二. 示例
1.准备
增加Spring
测试的依赖包到maven
:
<!-- Spring test 支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
2. 业务代码
在src/main/java
下的源码:
package org.light4j.sping4.senior.fortest;
public class TestBean {
private String content;
public TestBean(String content) {
super();
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
3. 配置类
在src/main/java
下的源码:
package org.light4j.sping4.senior.fortest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class TestConfig {
@Bean
@Profile("dev")
public TestBean devTestBean() {
return new TestBean("from development profile");
}
@Bean
@Profile("prod")
public TestBean prodTestBean() {
return new TestBean("from production profile");
}
}
4. 测试
在src/test/java
下的源码:
package org.light4j.sping4.senior.fortest;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) //①
@ContextConfiguration(classes = {TestConfig.class}) //②
@ActiveProfiles("prod") //③
public class DemoBeanIntegrationTests {
@Autowired //④
private TestBean testBean;
@Test //⑤
public void prodBeanShouldInject(){
String expected = "from production profile";
String actual = testBean.getContent();
Assert.assertEquals(expected, actual);
}
}
代码解释:
①
SpringJUnit4ClassRunner
在Junit
环境下提供Spring TestContext Framework
的功能。
②@ContextConfiguration
用来加载配置ApplicationContext
,其中classes
属性用来加载配置类。
③@ActiveProfiles
用来声明活动的profile
④ 可使用普通的@Autowired
注入Bean
。
⑤ 测试代码,通过JUnit
的Assert
来校验结果是否和预期一致。
运行结果如下图所示:
将@ActiveProfiles("prod")
改为@ActiveProfiles("dev")
,演示测试不能通过的情景,运行结果如下图所示:
5. 源代码示例:
公众号ID:longjiazuoA

未经允许不得转载:人生设计师 » Spring4.x高级话题(七):Spring的测试