SpringRunner与SpringBootTest的区别

83

在单元测试中,@RunWith(SpringRunner.class)@SpringBootTest 有什么不同?

你能解释一下它们各自的用例吗?


1
你有阅读过各种文档吗?还有什么不清楚的地方吗? - jonrsharpe
明显的区别在于Spring测试和Spring Boot测试,但这是一个非常广泛的问题。 - user7294900
1
我想了解在使用SpringRunner之外,何时应该使用@SpringBootTest。 - zouari
2
自JUnit 5起,不再需要使用RunWith,因此可以从您的单元测试代码中删除它。 - Tony B
3个回答

114

@RunWith(SpringRunner.class) : 你需要这个注解来启用Spring Boot的功能,如在JUnit测试期间使用的@Autowire@MockBean等。

该注解用于提供Spring Boot测试特性和JUnit之间的桥梁。每当我们在JUnit测试中使用任何Spring Boot测试特性时,都需要使用此注解。

@SpringBootTest : 这个注解用于加载完整的应用程序上下文进行端到端集成测试。

当我们需要引导整个容器时,可以使用@SpringBootTest注解。该注解通过创建将在我们的测试中使用的ApplicationContext来工作。

这篇文章清晰地阐述了这两种情况,并提供了具体示例:Baeldung


Baeldung的链接是解释这个概念最好的之一,但它的依赖关系不正确,因此无法工作。虽然我在我的pom中包含了所有的依赖项,但我仍然得到“Class <SpringRunner>无法解析为类型”的错误。 - Cagin Uludamar

56

@RunWith是JUnit 4中使用测试运行器(test runners)的旧注解。如果你正在使用JUnit 5(Jupiter),应该使用@ExtendWith来使用JUnit扩展。

请参见 https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing

“如果您使用JUnit 4,则不要忘记将@RunWith(SpringRunner.class)添加到您的测试中,否则注释将被忽略。如果您使用JUnit 5,则无需添加等效的@ExtendWith(SpringExtension.class),因为@SpringBootTest和其他@...Test注释已经使用了它。”


2
当我转换到JUnit 5时,我刚刚删除了RunWith注释。似乎也没有必要使用ExtendWith,因为你从Spring文档中引用的内容已经很明确了。 - Tony B

16

来自 spring.io :

@RunWith(SpringRunner.class) 告诉 JUnit 使用 Spring 的测试支持。 SpringRunnerSpringJUnit4ClassRunner 的新名称,它只是更容易阅读。

@SpringBootTest 表示“使用 Spring Boot 的支持进行引导”(例如,加载 application.properties 并提供所有 Spring Boot 的优点)

所以,如果您在集成测试中不需要 Spring Boot 加载的所有内容,则可能不需要 @SpringBootTest


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接