Junit 5 与 Mockito java.lang.NoSuchMethodError org.junit.platform.engine.EngineDiscoveryRequest.getDi
Posted
技术标签:
【中文标题】Junit 5 与 Mockito java.lang.NoSuchMethodError org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryListener()【英文标题】:Junit 5 with Mockito java.lang.NoSuchMethodError org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryListener() 【发布时间】:2020-08-13 08:38:00 【问题描述】:我正在尝试从 Junit 4 升级到 Junit 5,因此我们在测试中使用了 Mockito,因此要替换 Run 为我们必须添加 @ExtendWith(MockitoExtension::class)
并且我们将其添加到依赖项中
testImplementation("org.mockito:mockito-junit-jupiter:3.3.3")
我们在 gradle 中添加了这个
testImplementation("org.springframework.boot:spring-boot-starter-test")
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
exclude(group = "junit", module = "junit")
testImplementation("org.junit.jupiter:junit-jupiter:5.6.2")
在我们用 Mockito 运行这个测试类之后,我们得到了这个错误
org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.NoSuchMethodError: 'org.junit.platform.engine.EngineDiscoveryListener org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryListener()'
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:88)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:82)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:113)
at org.junit.vintage.engine.discovery.VintageDiscoverer.discover(VintageDiscoverer.java:44)
at org.junit.vintage.engine.VintageTestEngine.discover(VintageTestEngine.java:63)
at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:168)
at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:155)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
我看到了这个 question (JUnit 5 and Mockito) 并验证了答案,但对我也不起作用
更新 1
这里是整个 build.gradle
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins
id("org.springframework.boot") version "2.1.7.RELEASE"
id("io.spring.dependency-management") version "1.0.8.RELEASE"
kotlin("jvm") version "1.3.50"
kotlin("plugin.spring") version "1.3.50"
group = "-"
version = System.getenv("VERSION") ?: "local"
java.sourceCompatibility = JavaVersion.VERSION_12
repositories
mavenCentral()
dependencies
implementation("org.springframework.boot:spring-boot-starter-web")
.
.
.
.
testImplementation("org.junit.jupiter:junit-jupiter:5.6.2")
testImplementation("org.springframework.boot:spring-boot-starter-test")
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
exclude(group = "junit", module = "junit")
testImplementation("org.mockito:mockito-junit-jupiter:3.3.3")
【问题讨论】:
能否添加依赖testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0-M1'
。顺便问一下,您真的想使用里程碑版本吗?
我会更新它,因为我也在使用 5.6.2 但不工作
@Michael 注意org.junit.jupiter:junit-jupiter:<version>
应包括junit-jupiter-api
、junit-jupiter-params
和junit-jupiter-engine
(请参阅junit.org/junit5/docs/current/user-guide/…)。
@Sattar 好点!。您是否通过将test useJUnitPlatform()
添加到build.gradle
来在gradle 中启用本机junit 支持?你能分享你的build.gradle
吗?
@MichaelKreutz 我更新了问题,但没有我没有启用它应该放在哪里?
【参考方案1】:
据我所知,您的build.gradle
存在几个问题:
-
Mockito 版本与 junit 版本不兼容 -> 请删除 mockito 依赖中的显式版本
我的 IDE 还抱怨在
plugins
中使用 kotlin()
。 -> 请改成id
缺少对 junit 的原生支持 -> 请启用它
我的 IDE 还抱怨您如何排除 junit 4 依赖项
在下面的build.gradle
我已经修复了这些问题:
plugins
id 'org.springframework.boot' version '2.1.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.3.50'
group = "-"
version = System.getenv("VERSION") ?: "local"
java.sourceCompatibility = JavaVersion.VERSION_12
repositories
mavenCentral()
test
useJUnitPlatform()
dependencies
implementation("org.springframework.boot:spring-boot-starter-web")
testImplementation("org.junit.jupiter:junit-jupiter:5.6.2")
testImplementation("org.springframework.boot:spring-boot-starter-test")
exclude group : "org.junit.vintage", module : "junit-vintage-engine"
exclude group : "junit", module : "junit"
testImplementation("org.mockito:mockito-junit-jupiter")
【讨论】:
以上是关于Junit 5 与 Mockito java.lang.NoSuchMethodError org.junit.platform.engine.EngineDiscoveryRequest.getDi的主要内容,如果未能解决你的问题,请参考以下文章