Spring:整合Junit

问题引入

之前我们是这么写测试类的

// 全注解开发
@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

×

喜欢就点赞,疼爱就打赏