@RunWith(SpringRunner.class)的作用以及与spring的联系

发布时间 2024-01-02 11:28:24作者: 爱睡懒觉的我

原文链接:https://blog.csdn.net/weixin_70222287/article/details/130556340

@RunWith(SpringRunner.class)的作用

在JUnit 4下,有许多不同的测试运行器(Test Runner)可用于执行单元测试。默认情况下,Junit使用内置的测试运行器(BlockJUnit4ClassRunner)来运行单元测试。但是,对于一些特殊场景下的测试,我们可能需要使用其他测试运行器。

而Spring框架提供了一个测试运行器(SpringRunner或SpringJUnit4ClassRunner ), 它继承自 JUnit 的 BlockJUnit4ClassRunner 类。它可以加载 Spring 应用程序上下文并将其注入到测试类中,从而提供对依赖注入功能的支持。当您想要在测试期间使用 Spring 框架中的 beans 时,就需要在测试类上添加@RunWith(SpringRunner.class)注解,并使其运行基于 Spring 的单元测试。

通过@RunWith(SpringRunner.class)注解,JUnit会使用Spring的测试运行器来运行测试类中标注了@Test注解的测试方法,并配置Spring环境。整个测试生命周期都使用Spring容器来启动、进行和关闭,和真正运行Spring Boot应用程序并没有本质区别。

简而言之,@RunWith(SpringRunner.class)注解是为了在测试期间为您的代码创建一个 Spring ApplicationContext,并确保所有速记标记工作完美运行,如@Autowired 的注入等。这个注解补充JUnit,从而提供了基于Spring的测试功能,使得我们在测试时可以更加轻松地使用Spring的特性,而不需要自己搭建一个应用,提高了测试效率。

测试运行器:SpringRunner、SpringJUnit4ClassRunner

在 JUnit4 中,Spring Runner 有两个版本:SpringRunner和SpringJUnit4ClassRunner。它们都是基于 JUnit4 的 Spring 测试框架的实现,用于在测试类中支持加载 Spring Bean 容器并进行依赖注入。它们的区别如下:

SpringRunner包含在spring-test模块中,而SpringJUnit4ClassRunner已经过时,在新版本的 Spring 中已被删除,在旧版本中仍可使用。

SpringRunner间接继承自BlockJUnit4ClassRunner,而SpringJUnit4ClassRunner则直接继承自 JUnit4 的BlockJUnit4ClassRunner。

SpringRunner可以清除测试时创建的所有 bean 实例,使测试环境不受影响。而SpringJUnit4ClassRunner不支持此功能。

在针对多线程测试时,SpringRunner能够更好地和 JUnit 的规则(Rule)结合使用,而在SpringJUnit4ClassRunner中,JUnit 中的 Rule 不容易与其集成。

在实际应用中,建议使用 SpringRunner 来代替SpringJUnit4ClassRunner,因为它更加轻量,性能也更好,并支持最新的 Spring 版本。