且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

带有 Spring Boot 的 Junit 5:何时使用 @ExtendWith Spring 或 Mockito?

更新时间:2022-06-20 00:48:17

什么是 Junit 扩展

Junit 5 扩展的目的是扩展测试类或方法的行为

The purpose of Junit 5 extensions is to extend the behavior of test classes or methods

来源

阅读 Junit 5 扩展模型 &@ExtendWith 注释:这里

Read on Junit 5 Extension Model & @ExtendWith annotation :here

SpringExtension

SpringExtension 将 Spring TestContext 框架集成到 JUnit 中5 的木星编程模型.

SpringExtension integrates the Spring TestContext Framework into JUnit 5's Jupiter programming model.

public class SpringExtension
extends Object
implements BeforeAllCallback, AfterAllCallback, TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback, BeforeTestExecutionCallback, AfterTestExecutionCallback, ParameterResolver{..}

MockitoExtension

这个扩展是我们的 JUnit4 的 JUnit Jupiter 等价物MockitoJUnitRunner

This extension is the JUnit Jupiter equivalent of our JUnit4 MockitoJUnitRunner

public class MockitoExtension
extends java.lang.Object
implements BeforeEachCallback, AfterEachCallback, ParameterResolver{..}

可以看出,SpringExtension 实现了比MockitoExtension 更多的扩展.

As it can be seen , SpringExtension implements a lot more extensions than MockitoExtension.

还有 @SpringBootTest 使用 @ExtendWith(SpringExtension.class) 进行元注释,这意味着每次测试都使用 SpringExtension 进行扩展.@MockBean 是一个 Spring 测试框架注解,与 @ExtendWith(SpringExtension.class)

Also @SpringBootTest is meta annotated with @ExtendWith(SpringExtension.class) and which means every time your tests are extended with SpringExtension. @MockBean is a Spring test framework annotation and used along with @ExtendWith(SpringExtension.class)

要观察差异,请尝试以下操作

To observe the difference try the following

ExtendWith 仅限 MockitoExtension

@ExtendWith(MockitoExtension.class)
class TestServiceTest {

    @MockBean
    TestService service;

    @Test
    void test() {
        assertNotNull(service); // Test will fail
    }

}

ExtendWith 仅限 SpringExtension

@ExtendWith(SpringExtension.class)
class TestServiceTest {

    @MockBean
    TestService service;

    @Test
    void test() {
        assertNotNull(service); // Test succeeds
    }

}

ExtendWithSpringExtensionMockitoExtension

@ExtendWith(MockitoExtension.class)
@ExtendWith(SpringExtension.class)
class TestServiceTest {

    @MockBean
    TestService service;

    @Test
    void test() {
        assertNotNull(service); // Test succeeds
    }

}

由于测试类的 @SpringBootTest 注释如所述,两者都适用于您的情况.

Both works in your case because of the @SpringBootTest annotation for the test class as explained.

回答问题:何时使用 @ExtendWith Spring 或 Mockito?,

To answer the question : When to use @ExtendWith Spring or Mockito? ,

当测试需要 Spring 测试上下文(自动装配 bean/使用 @MockBean )以及 JUnit 5 的 Jupiter 编程模型时,请使用 @ExtendWith(SpringExtension.class).这也将通过 TestExecutionListeners 支持 Mockito 注释.

When the test requires a Spring Test Context ( to autowire a bean / use of @MockBean ) along with JUnit 5's Jupiter programming model use @ExtendWith(SpringExtension.class). This will support Mockito annotations as well through TestExecutionListeners.

当测试使用 Mockito 并且需要 JUnit 5 的 Jupiter 编程模型支持时使用 @ExtendWith(MockitoExtension.class)

When the test uses Mockito and needs JUnit 5's Jupiter programming model support use @ExtendWith(MockitoExtension.class)

希望对你有帮助