问题描述
Spring Boot 版本:2.1.6 JUnit 依赖版本:5.3.2(更高版本不可用(不工作))
build.gradle
dependency {
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude module: 'junit'
}
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
testRuntimeOnly("org.junit-vintage:junit-vintage-engine")
testImplementation("org.junit.jupiter:junit-jupiter-api")
testImplementation("org.junit.platform:junit-platform-runner)
}
其他常见的 junit5 测试代码运行良好。 位服务层单元测试不起作用。
JUnit4 测试代码:运行良好
import org.junit.Test;
// ....
public class SomeServiceUnitTest {
@Rule
public MockitoRule mockitoRule = MockitoJUnit.rule();
@InjectMock
SomeServiceImpl someService;
@Mock
SomeRepository someRepository;
@Test
public void somethingTestForSuccess() {
// GIVEN
when(someRepository.getSomething("abc")).thenReturn(100);
// WHEN
boolean result = someService.doSomething("testObject");
// THEN
assertTure(result);
}
}
但是,junit5:模拟存储库是 NullPointException
import org.junit.jupiter.api.Test;
// ....
class SomeServiceUnitTest {
@Rule
MockitoRule mockitoRule = MockitoJUnit.rule();
@InjectMock
SomeServiceImpl someService;
@Mock
SomeRepository someRepository;
@Test
void somethingTestForSuccess() {
// GIVEN
when(someRepository.getSomething("abc")).thenReturn(100);
// WHEN
boolean result = someService.doSomething("testObject");
// THEN
assertTure(result);
}
}
解决方法
在您的 JUnit 4 代码片段中,@Mock 注释字段已初始化,因为您正在使用 MockitoRule 加载 Mockito。 Mockito 负责创建模拟并将它们分配给 @Mock 注释字段。
但 JUnit 5 不支持规则:
https://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4-rule-support
在您的 JUnit 5 测试类中,@Rule 注释的 MockitoRule 字段被忽略,因此 Mockito 未加载且@Mock 注释的字段未分配。
要在您的 JUnit 5 测试类中加载 Mockito,请移除 MockitoRule 并使用 @ExtendWith(MockitoExtension.class) 注释该类。