问题引入
之前我们是这么写测试类的
// 全注解开发
@Test
public void testBefore() {
ApplicationContext context =new AnnotationConfigApplicationContext(AppConfig.class);
Calculator calculator = context.getBean(Calculator.class);
calculator.add(2,3);
}
// 使用xml配置
@Test
public void testAdd() {
ApplicationContext context = new ClassPathXmlApplicationContext("beanaop.xml");
Calculator calculator = context.getBean(Calculator.class);
calculator.add(4,3);
}
其中两行代码总是重复:
// 读取配置,创建Bean对象
ApplicationContext context =new AnnotationConfigApplicationContext(AppConfig.class);
// 获取Bean对象
Calculator calculator = context.getBean(Calculator.class);
//-------------------------------------------------------------------------------------
// 读取配置,创建Bean对象
ApplicationContext context = new ClassPathXmlApplicationContext("beanaop.xml");
// 获取Bean对象
Calculator calculator = context.getBean(Calculator.class);
这两行代码的作用是创建Spring容器,最终获取到对象,但是每次测试都需要重复编写。针对上述问题,我们需要的是程序能自动帮我们创建容器。我们都知道JUnit无法知晓我们是否使用了 Spring 框架,更不用说帮我们创建 Spring 容器了。Spring提供了一个运行器,可以读取配置文件(或注解)来创建容器。我们只需要告诉它配置文件位置就可以了。这样一来,我们通过Spring整合JUnit可以使程序创建spring容器了
准备相关内容
准备一个User类
@Component
public class User {
public void run() {
System.out.println("user.....");
}
}
准备一个xml配置bean.xml
<context:component-scan base-package="com.lin.junit"></context:component-scan>
准备一个配置类
@Configuration
@ComponentScan(basePackages = "com.lin.junit")
public class SpringConfig {
}
spring整合Junit 4
相关依赖
<!--spring 整合junit相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>6.0.2</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
如果是使用的配置类(纯注解)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class SpringTestJunit4ByAnno {
@Autowired
private User user;
@Test
public void testUser4() {
System.out.println(user);// com.lin.junit.junit5.User@306851c7
user.run(); //user.....
}
}
如果是使用的配置文件:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:bean.xml")
public class SpringTestJunit4 {
@Autowired
private User user;
@Test
public void testUser4() {
System.out.println(user);// com.lin.junit.junit5.User@314b8f2d
user.run();// user.....
}
}
注意
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ContextConfiguration {
@AliasFor("locations")
String[] value() default {};
@AliasFor("value")
String[] locations() default {};
......
}
locations是value的别名,value又是locations的别名,两个可以通用
spring整合Junit 5
相关依赖
<!--spring对junit的支持相关依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>6.0.2</version>
</dependency>
<!--junit5测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.0</version>
</dependency>
如果是使用的配置类(纯注解)
@SpringJUnitConfig(classes = SpringConfig.class)
public class SpringTestJunit5 {
//注入
@Autowired
private User user;
//测试方法
@Test
public void testUser() {
System.out.println(user);
user.run();
}
}
上面的@SpringJUnitConfig(classes = SpringConfig.class)
也可以由以下两个注解代替
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = SpringConfig.class)
public class SpringTestJunit5 {
//注入
@Autowired
private User user;
//测试方法
@Test
public void testUser() {
System.out.println(user);
user.run();
}
}
如果是使用的配置文件:
@SpringJUnitConfig(locations = "classpath:bean.xml")
public class SpringTestJunit5 {
//注入
@Autowired
private User user;
//测试方法
@Test
public void testUser() {
System.out.println(user);
user.run();
}
}
上面的@SpringJUnitConfig(locations = "classpath:bean.xml")
可以由下面两个注解代替
@ExtendWith(SpringExtension.class)
@ContextConfiguration("classpath:bean.xml")
public class SpringTestJunit5 {
//注入
@Autowired
private User user;
//测试方法
@Test
public void testUser() {
System.out.println(user);
user.run();
}
}
Junit 4 和 Junit 5 的区别
最重要的:两个导入的包不一样
- Junit4:
import org.junit.Test;
- Junit5:
import org.junit.jupiter.api.Test;
特征 | JUNIT 4 | JUNIT 5 |
---|---|---|
声明一种测试方法 | @Test | @Test |
在当前类中的所有测试方法之前执行 | @BeforeClass | @BeforeAll |
在当前类中的所有测试方法之后执行 | @AfterClass | @AfterAll |
在每个测试方法之前执行 | @Before | @BeforeEach |
每种测试方法后执行 | @After | @AfterEach |
禁用测试方法/类 | @Ignore | @Disabled |
测试工厂进行动态测试 | NA | @TestFactory |
嵌套测试 | NA | @Nested |
标记和过滤 | @Category | @Tag |
注册自定义扩展 | NA | @ExtendWith |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com