# 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

因为在 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 创建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

# 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
  • 首先需要在测试类上添加 @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 加载多个配置类

如果依赖多个配置类,还可以一次性加载多个配置类:

@SpringJUnitConfig(classes = {SpringConfig.class, DataSourceConfig.class})  // 指定多个 Spring 配置类
public class JUnitTest {
}
1
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

还可以混合使用:

@SpringJUnitConfig(
    classes = {AppConfig.class},   // 指定配置类
    locations = {"classpath:applicationContext.xml"}  // 指定xml配置文件
)
public class JUnitTest {
}
1
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

主要是测试的时候可以方便一些。