我无法在Eclipse 2023-09 (4.29.0)中运行JUnit 5.9.x的测试。

7
嗨, 我是从start.spring.io开始的,就像下面这样: enter image description here 我试图检查默认的测试是否正常,但是它甚至没有开始。而且,我在控制台上得到了这个错误,而不是测试结果。
java.lang.NoSuchMethodError: 'java.util.Set org.junit.platform.engine.TestDescriptor.getAncestors()'
    at org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener.getTestClassNames(StackTracePruningEngineExecutionListener.java:50)
    at org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener.executionFinished(StackTracePruningEngineExecutionListener.java:39)
    at org.junit.platform.launcher.core.DelegatingEngineExecutionListener.executionFinished(DelegatingEngineExecutionListener.java:46)
    at org.junit.platform.launcher.core.OutcomeDelayingEngineExecutionListener.reportEngineFailure(OutcomeDelayingEngineExecutionListener.java:83)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:203)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:94)
    at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:52)
    at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:70)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)


我谷歌了一下,人们说似乎与jupiter-api版本有关。 所以我添加了一些依赖项,像这样。但是没有起作用。
// build.gradle
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.3'
    id 'io.spring.dependency-management' version '1.1.3'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    
    
    testImplementation('org.junit.jupiter:junit-jupiter-api:5.9.3') /// added version
    testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.9.3') /// added version
}

tasks.named('test') {
    useJUnitPlatform()
}


我也尝试了不同的方法。我在我的Eclipse IDE上添加了Java Build Path,但也没有起作用。 (右键单击我的项目>属性>Java Build Path>模块路径(也尝试过类路径)>添加库>JUnit)
我没有看到关于JUnit错误的相同案例,错误信息是'java.util.Set org.junit.platform.engine.TestDescriptor.getAncestors()'。 所以我现在很困惑,请帮忙。

1
它能在5.10.0上运行吗,而不是5.9.3?顺便说一句,底部右侧的绿色高亮显示和_覆盖率_视图表明您可能错误地运行了_配置文件_。您可以通过点击_删除所有会话_按钮来取消_覆盖率_视图中的绿色高亮显示。 - undefined
3
dependencies块中通过显式版本声明无法覆盖由Spring Boot依赖管理声明的库的版本。相反,您必须使用https://www.baeldung.com/spring-boot-override-dependency-versions#2-gradle中描述的机制。 - undefined
1
就像@johanneslink所说的那样。根据我的经验,通常是你尝试使用的库的附加依赖导致了问题。这些问题通常是因为其中一个依赖使用了Java中后来版本(你现在正在使用的版本)已经移除的功能。你可以在这里查看从Java中移除的包(假设你正在使用Java 17 LTS):https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html - undefined
1
getAncestors 方法是 JUnit 5.10.0 的 org.junit.platform:junit-platform-engine:1.10.0 的一部分,这是目前最新的版本。在较低的版本中,该方法是缺失的(与 @majixin 所说的相反)。所以问题是:它是通过什么来使用的?请提供一个完整但最小化的可复现示例,包括一个 build.gradle 文件和测试代码。 - undefined
2
@userand 在这里报告会有所帮助。这个问题在Eclipse的Maven支持m2e中无法重现。所以我猜想与m2e不同,Buildship没有选择正确的JUnit启动器,而是使用了Eclipse中包含的junit-platform-launcher,并且在Eclipse 2023-09中已经更新到了1.10.0版本。 - undefined
显示剩余10条评论
3个回答

7
这似乎是Eclipse Buildship与JUnit低于5.10.0和Eclipse 2023-09 (4.29)之间的问题,我在这里报告了这个问题:
Eclipse Buildship问题#1265:在Eclipse 2023-09 (4.29)中运行JUnit 5.9.3测试时出现NoSuchMethodError 解决方法:
- 在build.gradle中添加依赖项testImplementation 'org.junit.platform:junit-platform-launcher:1.9.3'或 - 升级到JUnit 5.10.0:testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - 参见Daniele Repici的答案以了解不更改build.gradle的解决方法
原因:
似乎Buildship没有选择相应的(就像m2e似乎做的那样;至少这个问题在Maven中无法重现),而是使用了随Eclipse一起提供的版本。而在Eclipse 4.29中,已升级到1.10.0版本。但是调用了org.junit.platform.engine.TestDescriptor.html::getAncestors,这个方法是在中引入的,而在JUnit 5.9.3中的中却缺失了该方法。

3
我找到了一个不错的解决办法,不需要你改变项目。
当修改项目的依赖项不可行时,这个方法非常有用(例如,如果你需要向团队中的其他人解释为什么要覆盖Spring Boot的JUnit,或者如果你正在处理50多个不同的项目)。
在Eclipse中,转到“窗口”->“首选项”->“Gradle”。 在“高级选项”部分的“程序参数”下,添加:-Pjunit-jupiter.version=5.10.0
点击“应用”。
这与将ext[junit-jupiter.version]=5.10.0添加到你的build.gradle文件具有相同的效果,但可以避免修改你的项目,并且适用于所有项目。
这个工作是因为Spring Boot Management插件的工作方式。Spring Boot依赖BOM使用占位符来表示所有版本。你可以在Maven中点击POM链接找到这些占位符的名称。

1
不错!对于特定的项目,这也可以在“项目 > 属性:Gradle”中完成。 - undefined

1
我认为这只是关于Eclipse 2023-09和Junit的兼容性问题。 @howlger要求提供最小示例以确认,所以这是它。 我创建了一个新的Gradle项目(包装器,版本8.1.1),使用了标准的源代码布局。

build.gradle

apply plugin: 'java'
java {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}
repositories {
    mavenCentral()
}
compileJava {
    options.encoding = "UTF-8"
}
compileTestJava {
    options.encoding = "UTF-8"
}

dependencies {    
    testImplementation("org.junit.jupiter:junit-jupiter:5.9.3")
    testImplementation("org.junit.vintage:junit-vintage-engine:5.9.3")
}

settings.gradle

rootProject.name = 'JunitBug'

StubTest.java

package com.junitbug;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

    class StubTest {
        @Test
        void test() {
            boolean b = true;
            assertTrue(b);
        }
    }

在Eclipse中进行测试运行后,我遇到了相同的异常。
java.lang.NoSuchMethodError: 'java.util.Set org.junit.platform.engine.TestDescriptor.getAncestors()'
    at org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener.getTestClassNames(StackTracePruningEngineExecutionListener.java:50)
    at org.junit.platform.launcher.core.StackTracePruningEngineExecutionListener.executionFinished(StackTracePruningEngineExecutionListener.java:39)
    at org.junit.platform.launcher.core.DelegatingEngineExecutionListener.executionFinished(DelegatingEngineExecutionListener.java:46)
    at org.junit.platform.launcher.core.OutcomeDelayingEngineExecutionListener.reportEngineFailure(OutcomeDelayingEngineExecutionListener.java:83)
    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:203)
    ....

在 build.gradle 中将 junit 版本更新为 5.10.0 可以解决这个问题。 请注意,在两种情况下,“gradlew test”都可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接