一、spring整合 junit 问题解析
- 应用程序的入口
- main 方法
- Junit单元测试中,没有 main 方法也能执行
- junit 集成了一个 main 方法
- 该方法就会判断当前测试类中那些方法有 @Test 注解
- junit 就让有 Test 注解的方法执行
- junit 不会管我们是否采用 spring 框架
- 在执行测试方法时,junit根本不知道我们是不是使用了 spring 框架
- 所以也就不会为我们读取配置文件/配置类创建 spring 核心容器
- 由以上三点可知
- 当测试方法·执行时,没有 IOC 容器,就算写了 Autowired 注解,也无法实现注入
二、Spring 整合 junit 的配置
1.加入架包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
<scope>test</scope>
</dependency>
2.@Runwith
使用 Junit 提供的一个注解把原来的 main 方法替换了,替换成 spring 提供的
这里面要求的是一个字节码,必须是继承 Runner 这个类
3.@ContextConfiguration
告知 spring 的运行期,spring 和 ioc 创建是基于 xml 还是注解的,并且说明位置
- @ContextConfiguration
- locations:指定 xml 文件的位置,加上 classpath 关键字,表示在类路径下
- classes:指定注解类所在地理位置
- 注意:当我们使用 spring 5.x 版本的时候,要求 Junit 的 jar 必须是 4.12 及以上
package com.test;
import com.config.JdbcConfig;
import com.config.SpringConfiguration;
import com.domain.Account;
import com.service.IAccountService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {
@Autowired
IAccountService as=null;
@Test
public void testFindAllAccount(){
//3.执行方法
List<Account> accounts = as.findAllAccount();
for (Account account:accounts){
System.out.println(account);
}
}
}