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

java12399900:

我具有以下所有我的具体单元测试类都扩展的抽象单元测试类

@ExtendWith(SpringExtension.class)
//@ExtendWith(MockitoExtension.class)
@SpringBootTest(
    classes = PokerApplication.class,
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
public abstract class AbstractUnitTests {

    @MockBean
    public RoundService roundService;

    @MockBean
    public RoundRepository roundRepository;
}

使用@ExtendWith(SpringExtension.class)之间有什么区别@ExtendWith(MockitoExtension.class)

我问,使用任何一个注释似乎都没有什么区别,并且它们在我的代码中都可以分别工作-允许我使用Junit5。那么为什么两者都起作用?

具体测试班:

    @DisplayName("Test RoundService")
    public class RoundsServiceTest extends AbstractUnitTests {

        private static String STUB_USER_ID = "user3";

        // class under test
        @InjectMocks
        RoundService roundService;

        private Round round;

        private ObjectId objectId;

        @BeforeEach //note this replaces the junit 4 @Before
        public void setUp() {

            initMocks(this);
            round = Mocks.round();
            objectId = Mocks.objectId();
        }

        @DisplayName("Test RoundService.getAllRoundsByUserId()")
        @Test
        public void shouldGetRoundsByUserId() {

            // setup
            given(roundRepository.findByUserId(anyString())).willReturn(Collections.singletonList(round));

            // call method under test
            List<Round> rounds = roundService.getRoundsByUserId(STUB_USER_ID);

            // asserts
            assertNotNull(rounds);
            assertEquals(1, rounds.size());
            assertEquals("user3", rounds.get(0).userId());
        }
}

相关的Build.gradle部分

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.2.2.RELEASE'

    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    implementation 'junit:junit:4.12'
}

test {
    useJUnitPlatform()
}
RG:

什么是Junit扩展

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

资源

Junit 5扩展模型@ExtendWith注释上阅读此处

SpringExtension

SpringExtension将Spring TestContext Framework集成到JUnit 5的Jupiter编程模型中。

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

MockitoExtension

此扩展等效于我们的JUnit4 MockitoJUnitRunner的JUnit Jupiter

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

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

@SpringBootTest带有meta注释,@ExtendWith(SpringExtension.class)这意味着每次使用扩展测试时SpringExtension@MockBean是Spring测试框架的注解,与@ExtendWith(SpringExtension.class)

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

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解释了测试类注释。

要回答这个问题:什么时候使用@ExtendWithSpring或Mockito?

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

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

希望这可以帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring JUnit 5 ExtendWith TestContainer

使用@ExtendWith(MockitoExtension.class)的Spring Boot JUnit 5测试不起作用-模拟为空,MockitoJUnitRunner正在工作

在 Spring Boot 中使用 JUnit5 和 Mockito 进行集成测试

如何使用Mockito和JUnit在Spring Boot中测试DELETE方法

如何使用Java JUnit和Mockito验证传递给静态函数的参数(Spring Boot)

Mockito,JUnit和Spring

Spring Boot JUnit5:TypeCast 模拟

在 Spring Boot 中使用 Mockito 模拟 JsonNode

带Objectify的Spring Boot

Spring Boot项目的JUnit和Mockito依赖关系

Junit 5 mockito無法在spring boot應用程序中讀取用@Value註釋的屬性文件

无法在 Spring Boot 中使用 JUnit 5 模拟 RestTemplate

SpringRunner是否应在Junit 5的Spring Boot中使用

在 Spring Boot 中使用 Junit 5 进行测试失败

如何使用带的Mockito JUnit5

如何验证使用Spring,JUnit和Mockito发布了事件?

如何使用Junit和Mockito测试Spring验证器

使用Mockito和Junit时如何自动装配Spring bean?

使用Spring Boot在JUnit测试中的Spring JavaMailSenderImpl上的ClassNotFoundException

带有Spring Boot 1.5的Junit5

在Kotlin和JUnit5中测试Spring Boot缓存

如何使用Mockito在Spring Boot中模拟异步(@Async)方法?

使用Spring Boot和Mockito进行模拟对象方法调用

如何使用Mockito在Spring Boot中测试资源加载器

Junit / Spring Boot模拟类

Spring Boot OncePerRequestFilter shouldNotFilter Junit

Spring Boot Junit测试-ClassNotFoundException

Spring Boot:如何使用@Validated注释在JUnit中测试服务?

使用 Spring Boot CRUD 的 Junit 中的空指针异常