gpt4 book ai didi

java - Junit 5与Spring Boot : When to use @ExtendWith Spring or Mockito?

转载 作者:行者123 更新时间:2023-12-02 08:40:00 26 4
gpt4 key购买 nike

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

@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()
}

最佳答案

什么是 Junit 扩展

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

source

阅读Junit 5扩展模型@ExtendWith注释:here

SpringExtension

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

This extension is the JUnit Jupiter equivalent of our JUnit4 MockitoJUnitRunner

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

可以看出,SpringExtensionMockitoExtension 实现了更多的扩展。

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

一起使用

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

ExtendWithMockitoExtension

@ExtendWith(MockitoExtension.class)
class TestServiceTest {

@MockBean
TestService service;

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

}

ExtendWithSpringExtension

@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 注释,两者都适用于您的情况,如所解释的。

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

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

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

希望这有帮助

关于java - Junit 5与Spring Boot : When to use @ExtendWith Spring or Mockito?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61433806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com