更新时间: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 将 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{..}
这个扩展是我们的 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
}
}
ExtendWith
与 SpringExtension
和 MockitoExtension
@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)
希望对你有帮助