# Spring教程 - 9 Spring整合JUnit
前面在学习的时候,项目中也集成了 JUnit,但是并不是以 Spring 的方式集成 JUnit 的,因为每次得手动加载 bean.xml 或 Spring 配置类:
// 1. 加载spring的配置文件,在类路径下加载,类路径指的是src/main/resources
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
// 2. 通过ID获取配置创建的对象
UserService userService = (UserService) context.getBean("userService");
1
2
3
4
2
3
4
因为在 Spring 应用里,我们的代码很多依赖 Spring 容器(比如 @Autowired
注入的 Bean),普通的 JUnit 测试不能自动加载 Spring 容器。
我们可以使用 Spring 整合 JUnit,整合之后,就可以在测试类里:
- 自动加载 Spring 上下文(ApplicationContext)
- 直接使用 bean 的依赖注入
# 9.1 整合JUnit5
# 1 引入依赖
首先需要在项目的 pom.xml 引入依赖:
<!-- 引入junit5依赖 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.13.4</version>
</dependency>
<!-- 引入spring 对 junit的支持依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>6.2.11</version>
<scope>test</scope>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 2 创建Spring配置类
这里直接使用注解方式,所以只用 Spring 配置类的方式:
package com.foooor.hellospring.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration // 标识是配置类
@EnableAspectJAutoProxy // 开启基于 @AspectJ 注解的 AOP
@ComponentScan("com.foooor.hellospring") // 扫描包
public class SpringConfig {
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 3 业务类
业务类我就省略了,还是之前的 ICalculatorService 接口和 CalculatorServiceImpl 实现类。
# 4 测试类
直接编写测试类,测试 Service 中的方法。
package com.foooor.hellospring;
import com.foooor.hellospring.config.SpringConfig;
import com.foooor.hellospring.service.ICalculatorService;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@SpringJUnitConfig(SpringConfig.class) // 指定 Spring 配置类
public class JUnitTest {
private static final Logger logger = LoggerFactory.getLogger(JUnitTest.class);
@Autowired
private ICalculatorService calculatorService;
@Test
public void test() {
int result = calculatorService.add(1, 2);
logger.info("----result:{}", result);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- 首先需要在测试类上添加
@SpringJUnitConfig
注解,指定 Spring 的配置类。 - 然后就可以在测试类中通过
@Autowired
直接注入 bean,然后就可以调用 bean 中的方法了,非常方便。
需要注意,我们的测试类也是要在 Spring 的扫描包下的,可以放在测试包下。
所以项目结构如下:
# 9.2 整合扩展
# 1 加载XML配置
上面是加载 Spring 配置类,当然可以指定 Spring XML:
@SpringJUnitConfig(locations = "classpath:bean.xml") // 指定 Spring xml配置文件
public class JUnitTest {
}
1
2
3
2
3
# 2 加载多个配置类
如果依赖多个配置类,还可以一次性加载多个配置类:
@SpringJUnitConfig(classes = {SpringConfig.class, DataSourceConfig.class}) // 指定多个 Spring 配置类
public class JUnitTest {
}
1
2
3
2
3
如果使用的 XML 方式,则配置方式如下:
@SpringJUnitConfig(locations = {
"classpath:applicationContext.xml",
"classpath:application-dao.xml",
"classpath:application-service.xml"
})
public class JUnitTest {
}
1
2
3
4
5
6
7
2
3
4
5
6
7
还可以混合使用:
@SpringJUnitConfig(
classes = {AppConfig.class}, // 指定配置类
locations = {"classpath:applicationContext.xml"} // 指定xml配置文件
)
public class JUnitTest {
}
1
2
3
4
5
6
2
3
4
5
6
# 3 其他注解实现
除了使用 @SpringJUnitConfig
注解,还可以使用 @ExtendWith
和 @ContextConfiguration
注解实现。
举个栗子:
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.ContextConfiguration;
@ExtendWith(SpringExtension.class) // 整合 JUnit 5
@ContextConfiguration(classes = SpringConfig.class) // 加载配置类
public class JUnitTest {
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
主要是测试的时候可以方便一些。