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

问题描述 投票:0回答:3

嗨 我从 start.spring.io 开始,如下所示

我试图检查默认情况下测试是否正常。

但这还没有开始。我在控制台中收到此错误而不是测试结果。

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 构建路径,但它也不起作用。
(右键单击我的项目>属性> Java构建路径
>模块路径(也已经尝试过类路径。)>添加库> JUnit

我没有看到与

'java.util.Set org.junit.platform.engine.TestDescriptor.getAncestors()'
有关 JUnit 错误的相同情况。
所以我现在很困惑。请帮忙。

spring-boot eclipse gradle junit5 buildship
3个回答
1
投票

我认为这只是关于 Eclipse 2023-09 和 Junit 兼容性。 @howlger 询问了最少的例子来确认,所以这就是它。 我已经使用标准源布局创建了新的 gradle 项目(包装器,版本 8.1.1)。

构建.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")
}

设置.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 测试”在这两种情况下都可以正常工作。


1
投票

我找到了一个很好的解决方法,不需要您更改项目。

当无法修改项目的依赖项时,这非常有用(例如,如果您必须使用其他类型的 IDE 向团队的其他成员证明为什么要覆盖 Spring Boot 的 JUnit 和/或如果您正在开发50 多个不同的项目)。

在 Eclipse 中,转到

Window --> Preferences --> Gradle。 在高级选项部分的程序参数下,添加:-Pjunit-jupiter.version=5.10.0

点击

应用

这与将

ext[junit-jupiter.version]=5.10.0

 添加到 
build.gradle 文件具有相同的效果,但可以让您免于修改项目,并且适用于您的所有项目。

这之所以有效,是因为 Spring Boot 管理插件的工作方式。 Spring Boot 依赖项 BOM 为其所有版本使用占位符。

您可以通过单击 POM 链接来找到 Maven 中的占位符名称


1
投票
这似乎是 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 似乎没有选择相应的

junit-platform-launcher

(m2e 似乎也是这样做的;至少这个问题无法用 Maven 重现),而是使用 Eclipse 附带的 
junit-platform-launcher
 版本。并且在Eclipse 4.29中
junit-platform-launcher
已经升级到1.10.0。但是 
org.junit.platform:junit-platform-launcher:1.10.0
 调用了 
org.junit.platform.engine.TestDescriptor.html::getAncestors
,它已在 
org.junit.platform:junit-platform-engine:1.10.0
 中引入,但在 JUnit 5.9.3 的 
org.junit.platform:junit-platform-engine:1.9.3
 中缺失。

© www.soinside.com 2019 - 2024. All rights reserved.