在单元测试中,@RunWith(SpringRunner.class)
和 @SpringBootTest
有什么不同?
你能解释一下它们各自的用例吗?
在单元测试中,@RunWith(SpringRunner.class)
和 @SpringBootTest
有什么不同?
你能解释一下它们各自的用例吗?
@RunWith(SpringRunner.class) : 你需要这个注解来启用Spring Boot的功能,如在JUnit测试期间使用的@Autowire
,@MockBean
等。
该注解用于提供Spring Boot测试特性和JUnit之间的桥梁。每当我们在JUnit测试中使用任何Spring Boot测试特性时,都需要使用此注解。
@SpringBootTest : 这个注解用于加载完整的应用程序上下文进行端到端集成测试。
当我们需要引导整个容器时,可以使用@SpringBootTest注解。该注解通过创建将在我们的测试中使用的ApplicationContext来工作。
这篇文章清晰地阐述了这两种情况,并提供了具体示例:Baeldung。
@RunWith是JUnit 4中使用测试运行器(test runners)的旧注解。如果你正在使用JUnit 5(Jupiter),应该使用@ExtendWith来使用JUnit扩展。
“如果您使用JUnit 4,则不要忘记将@RunWith(SpringRunner.class)添加到您的测试中,否则注释将被忽略。如果您使用JUnit 5,则无需添加等效的@ExtendWith(SpringExtension.class),因为@SpringBootTest和其他@...Test注释已经使用了它。”
来自 spring.io :
@RunWith(SpringRunner.class)
告诉 JUnit 使用 Spring 的测试支持。SpringRunner
是SpringJUnit4ClassRunner
的新名称,它只是更容易阅读。
@SpringBootTest
表示“使用 Spring Boot 的支持进行引导”(例如,加载application.properties
并提供所有 Spring Boot 的优点)
所以,如果您在集成测试中不需要 Spring Boot 加载的所有内容,则可能不需要 @SpringBootTest