NoSuchMethodError: 'java.util.Set org.junit.platform.engine.TestDescriptor.getAncestors()

回答 2 浏览 1497 2023-10-06

在 Spring Tool Suite (4.20.0) 中运行 JUnit 测试时出现此错误。

测试运行正常,但最后抛出此错误 -

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)

这是我的 Gradle 插件部分 -

plugins {
    id 'java'
    id 'eclipse'
    id 'eclipse-wtp'
    id 'org.springframework.boot' version "3.1.4"
    id 'io.spring.dependency-management' version "1.1.3"
}

这是我的 Gradle 依赖项部分 -

implementation("org.springframework.boot:spring-boot-starter-parent:3.1.4")
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-configuration-processor")
implementation("org.springframework.boot:spring-boot-starter-test")

我究竟做错了什么?

我的测试课非常基础 -

@ExtendWith(SpringExtension.class)
@ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class, classes = { TransformService.class})
@Slf4j
public class TransformServiceTest {

    @Autowired
    TransformService transformService;

    @Test
    public void transformXmlTest() throws Exception {
        transformService.transformXml();
    }
}

那么,我的服务级别是 -

@Service
@Slf4j
public class TransformService {

    public void transformXml() {
        log.info("Transforming XML");
    }
}

我通过右键单击 Package Explorer 中的“TransformXmlTest()”并单击“Run as - JUnit Test”在 STS 中运行测试。 (当我使用 Gradle 任务在 STS 外部运行它时,一切看起来都很干净)。

这是完整的日志条目 -

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
2023-10-06 10:00:33.097  INFO Transforming XML | com.dowill.xsl.service.TransformService
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)

感谢您的帮助

Do Will 提问于2023-10-06
请参加导览,了解 Stack Overflow 的工作原理并阅读如何提问或如何提高问题的质量。然后编辑您的问题以包含您的完整源代码作为最小可重现示例,可以对其进行编译和测试由其他人。包含的源应该是文本格式,而不是图像。zforgo 2023-10-06
抱歉,我认为我最初的帖子足以提供线索。现在添加了更多代码。如果我错过了什么,请告诉我。Do Will 2023-10-06
我假设不同的 JUnit Jupiter 模块存在混合/冲突版本。相关方法已在JUnit 5.10(2023年7月23日)中发布。确保所有与 JUnit 相关的依赖项,甚至插件模块(平台、引擎、启动器等)都使用相同的兼容版本。zforgo 2023-10-06
我检查了依赖树,我只有 5.9.3 的 junit-jupiter 和 1.9.3 的 junit-platform 。依赖关系由 spring 依赖管理器管理。仅当我在 STS 中运行测试时才会出现此错误。当我在外面运行它(使用 gradle 任务)时,一切看起来都很好。所以,我假设这与 STS/Eclipse 的配置方式有关。我尝试更新所有软件,但无济于事。Do Will 2023-10-07
2 个回答
#1楼
得票数 5

这与 Gradle 及其与 Eclipse 的集成(Buildship)有关。您将在面向 Java 开发人员的普通 Eclipse 中获得相同的行为。

解决方案是将以下内容添加到 build.gradle 中的依赖项中:

testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

您还可以使用基于 Eclipse 4.28 而不是最新的 4.29 的 STS 4.20.0 发行版,或者在下面的问题中寻找更多解决方法 - 非常有帮助。还有 Eclipse 4.29 发行版出了什么问题的解释。

更多信息可以在这里找到:https://github.com/eclipse/buildship/issues/1265

aboyko 提问于2023-10-11
aboyko 修改于2023-10-11
非常感谢您提供该链接。想知道为什么当我搜索错误消息时没有出现这个问题。不管怎样,我现在就坚持使用 STS 4.19.0。Do Will 2023-10-11
#2楼 已采纳
得票数 2

我切换到 STS 4.19.0,不再看到此错误。不知道这是否是 STS 4.20.0 的问题。

我在这里标记了 spring-tools-4,希望 STS 社区的人能看一下。

Do Will 提问于2023-10-08
Do Will 修改于2023-10-11
这看起来很奇怪。我检查了 STS 4.20 插件,它包含最新版本的 JUnit 5 引擎/平台。我怀疑 STS 在 JUnit Core 中仍然包含与新版本不兼容的旧版本。Sergiy 2023-10-10
我想它必须与构建有关(Gradle 集成到 Eclipse 中)。如果我使用 Maven 尝试完全相同的项目,则测试运行良好。aboyko 2023-10-11