@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 版本。