Spring 整合 Junit
# 60.Spring 整合 Junit
我们在介绍 Spring 的时候说过,Spring 整合了很多流行的框架,那么当然也包括 Junit
# 目前项目存在的问题
我们目前的测试类中,其实是有很多重复代码的,每个方法都包含了创建容器,获取对象的代码。用我们之前的知识来解决的话,可以使用@Before 注解:
public class AccountServiceTest {
private ApplicationContext ac ;
private IAccountService as;
@Before
public void init() {
ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
as = ac.getBean("accountService", IAccountService.class);
}
@Test
public void testFindAll() {
ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
ac.getBean("accountService", IAccountService.class);
List<Account> allAccount = as.findAllAccount();
for (Account account : allAccount) {
System.out.println(account);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在实际开发过程中,开发人员和测试人员可能不是同一人!也就是说,让测试人员去编写初始化的方法,是比较困难的,因为他可能不懂我们的代码,只关心测试结果。
那么怎么解决呢?我们来分析下:
- 应用程序的入口:main 方法
- Junit 单元测试中,没有 main 方法也能执行,这是因为 Junit 集成了一个 main 方法,该方法就会判断当前测试类中哪些方法有 @Test 注解,Junit 就让有 Test 注解的方法执行
- Junit 不会管我们是否采用 Spring 框架,在执行测试方法时,Junit 根本不知道我们是不是使用了 Spring 框架,所以也就不会为我们读取配置文件/配置类创建 spring 核心容器
- 由以上三点可知,当测试方法执行时,没有 IoC 容器,就算写了 Autowired 注解,也无法实现注入
为此,我们需要使用 Spring 提供的整合 Junit 的依赖,替代 Junit 中默认的 main 方法,使其可创建 IoC 容器。
# Spring 整合 Junit
整合步骤:
导入 Spring 整合 Junit 的 依赖
使用 Junit 提供的一个注解,把原有的 main 方法替换了,替换成 Spring 提供的 @Runwith 注解,它会读取配置文件或者注解,创建容器。
使用@ContextConfiguration 注解,告知 Spring 注解或 XML 文件的配置。取值有:
locations:指定 xml 文件的位置,需加上 classpath 关键字,表示在类路径下。
classes:指定注解类所在地位置 ,需加上 classpath 关键字,表示在类路径下。
例如:
@ContextConfiguration(classes = SpringConfiguration.class)
@ContextConfiguration(locations = "classpath:bean.xml")
2
接下来我们开始整合。
# 导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
2
3
4
5
注意,spring-test 的版本最好和 spring 一致
同时,当我们使用 Spring 5.x 版本的时候,要求 Junit 必须是 4.12 及以上,否则会报错:
Caused by: java.lang.IllegalStateException: SpringJUnit4ClassRunner requires JUnit 4.12 or higher.
# 使用 spring-test 的注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {
@Autowired
private ApplicationContext ac ;
@Autowired
private IAccountService as;
}
2
3
4
5
6
7
8
9
10
此时,测试方法就可以正常运行了。
# 源码
本项目已将源码上传到 GitHub (opens new window) 和 Gitee (opens new window) 上。并且创建了分支 demo8,读者可以通过切换分支来查看本文的示例代码。
- 01
- 中国网络防火长城简史 转载10-12
- 03
- 公告:博客近期 RSS 相关问题10-02