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-apijunit-jupiter-paramsjunit-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的主要内容,如果未能解决你的问题,请参考以下文章

Junit mockito

如何在 JUnit5 中使用 Mockito

基于Junit5+PowerMock的单元测试框架

如何使用 mockito 和 junit 测试此功能?

Junit/Mockito:选择使用模拟或集成测试运行测试

Mockito & Junit 空指针异常:名称不能为空