org.junit.platform.commons.JUnitException: 测试引擎ID为“junit-jupiter”的测试失败,无法发现测试

50

我希望将Junit 5测试实现到Gradle项目中。我尝试了以下配置:

Gradle配置:

plugins {
    id 'org.springframework.boot' version '2.5.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'test'
version = '0.0.1'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

ext {
    set('springCloudVersion', "2020.0.4")
}

dependencies {
    ...............
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    useJUnitPlatform()
}

Junit 测试:

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;

import java.util.concurrent.TimeUnit;

public class GeneratePdf {

    @DisplayName("Test MessageService.get()")
    @Test
    @Timeout(value = 60, unit = TimeUnit.SECONDS)
    public void generatePdfFileTes() throws InterruptedException
    {
        System.out.println("test!");
    }

}

当我运行代码时,出现错误:

Internal Error occurred.
org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests
    at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:160)
    at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:134)
    at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:108)
    at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:80)
    at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:110)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86)
    at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86)
    at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53)
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
    at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: org.junit.platform.commons.JUnitException: MethodSelector [className = 'org.merchant.poc.GeneratePdf', methodName = 'generatePdfFileTes', methodParameterTypes = ''] resolution failed
    at org.junit.platform.launcher.listeners.discovery.AbortOnFailureLauncherDiscoveryListener.selectorProcessed(AbortOnFailureLauncherDiscoveryListener.java:39)
    at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:102)
    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.jupiter.engine.discovery.DiscoverySelectorResolver.resolveSelectors(DiscoverySelectorResolver.java:46)
    at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69)
    at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:152)
    ... 13 more
Caused by: org.junit.platform.commons.PreconditionViolationException: Could not load class with name: org.merchant.poc.GeneratePdf
    at org.junit.platform.engine.discovery.MethodSelector.lambda$lazyLoadJavaClass$0(MethodSelector.java:157)
    at org.junit.platform.commons.function.Try$Failure.getOrThrow(Try.java:335)
    at org.junit.platform.engine.discovery.MethodSelector.lazyLoadJavaClass(MethodSelector.java:156)
    at org.junit.platform.engine.discovery.MethodSelector.getJavaClass(MethodSelector.java:135)
    at org.junit.jupiter.engine.discovery.MethodSelectorResolver.resolve(MethodSelectorResolver.java:73)
    at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve$2(EngineDiscoveryRequestResolution.java:146)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
    at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647)
    at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:185)
    at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:125)
    at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:91)
    ... 18 more
Caused by: java.lang.ClassNotFoundException: org.merchant.poc.GeneratePdf
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at org.junit.platform.commons.util.ReflectionUtils.lambda$tryToLoadClass$9(ReflectionUtils.java:829)
    at org.junit.platform.commons.function.Try.lambda$call$0(Try.java:57)
    at org.junit.platform.commons.function.Try.of(Try.java:93)
    at org.junit.platform.commons.function.Try.call(Try.java:57)
    at org.junit.platform.commons.util.ReflectionUtils.tryToLoadClass(ReflectionUtils.java:792)
    at org.junit.platform.commons.util.ReflectionUtils.tryToLoadClass(ReflectionUtils.java:748)
    ... 34 more

你知道如何解决这个问题吗?

编辑:

import org.junit.jupiter.api.Test;

public class InvoiceTests {

    @Test
    public void generateTest()
    {
        System.out.println("test!");
    }

}

我尝试过这个,但是它仍然不起作用。


1
从堆栈跟踪 "java.lang.ClassNotFoundException: org.merchant.poc.GeneratePdf" 来看,您的设置似乎有问题。可能是版本冲突、源路径或其他一些问题。如果清洁构建没有帮助,我建议您创建一个最小的可重现存储库,并在此处链接它,以便其他人可以重新创建该效果。 - johanneslink
22个回答

36

当我将JUnit的版本从5.7.0升级到5.8.2时,出现了这个问题。 尝试使用版本5.7.0的org.junit.jupiter:junit-jupiter-apiorg.junit.jupiter:junit-jupiter-engine


5
同样的问题。我们知道导致这个问题的5.8.2版本有什么不同吗? - Antony Stubbs
3
谢谢,这很有帮助。当我从Spring Boot 2.5.10升级到2.6.5时,这是解决我的问题的方法。 - Younes El Ouarti
是的,对我也有效,Eclipse版本为Version: 2022-03 (4.23.0) Build id: 20220310-1457,已更改为5.7.0。谢谢。 - Gaganam Krishna
谢谢!我也用Intellij runner(Intellij Ultimate 2022.2.3)和Apache Ant 1.10.10成功运行了。 - Max M

15

环境:

  • IntelliJ
  • Java 17

在将我的项目从JDK 11升级到JDK 17以及将junit-jupiter-api从5.7.0升级到5.8.2后,我遇到了相同的问题。

在我的项目中,工作版本是5.7.2。

在这里查看问题:Github issue


9
在我的情况下,mvn clean compile 命令有所帮助。

谢谢,这也对我的情况有所帮助。 - Rok T.
2
@RokT。不要留下“谢谢”的评论,那是评分的作用。尽管如此,我很高兴能帮到你。 - Valerij Dobler

8
你们遵循的是哪种项目结构?我记得当我刚开始时也遇到了类似的问题,所以我就按照这个结构进行了操作:
project-dir
 -- src
     -- main
        -- java
            -- classes
     -- test
        -- java
            -- test-classes

除了上述结构之外,确保按照答案中提到的@johanneslink所述的正确格式来命名您的测试类。

当然。确切地说。 - undefined

3

仅添加此依赖项即可解决此问题。我尝试使用5.6.2,任何版本都可以。

testImplementation('org.junit.jupiter:junit-jupiter:5.6.2')

这对我来说在Kotlin 1.7.10和JDK 17.0.4上运行良好。但是这些其他的jupiter版本没有起作用:5.6.3、5.7.0、5.7.2、5.8.2、5.9.1。 - devdanke

3

GeneratePdf 不符合测试类的默认命名模式。默认模式为 Test*|*Test|*Tests

您可以在 Gradle 文件中更改它:

test {
  useJUnitPlatform()
  include '**/*Pdf'
}

我尝试更改名称(参见帖子),但仍然无法正常工作。 - Peter Penzov

2
我必须添加这个才能与 spring-boot-starter-test 和 JDK 17 兼容。
    ext['junit-jupiter.version'] = '5.9.0'

注意:这是除了正常的测试依赖和test任务配置之外的额外内容。
注意2:据我所知,对于测试类和测试方法的名称要求以及public可见性在junit5中不再适用(不需要public class MyClassTestpublic void mymethodTest())。 参考文献在这里

这解决了我的问题,因为Spring降级了一些(但不是全部)的JUnit依赖。 - undefined

1

我遇到了同样的错误,因为我将我的集成测试类命名为XyzIT,修改为XyzIntegrationTest后,它开始正常工作。


3
Maven使用两个不同的插件。对于集成测试(以 IT 结尾),Maven使用 maven-failsafe-plugin,而对于普通单元测试,Maven使用 maven-surefire-plugin - Valerij Dobler
@ValerijDobler 好的,那么我还有什么其他方法可以修复我的IT错误呢? - ADJ

1
如果您使用的是IntelliJ IDE,请检查是否将该目录设置为测试目录。
这个目录没有被标记为测试源,所以图标颜色是灰色的,文件夹也是完全填充的。

enter image description here

这是将目录标记为测试源的方法。

enter image description here

现在,该目录被标记为测试源,改变了颜色和其他文件夹的图标,现在IDE可以识别目录中的测试 :)

enter image description here


1

你指定的JUnit库版本必须与JUnit POMs匹配。

在例行依赖项升级期间,我遇到了这个错误。我将junit-jupiter-apijunit-jupiter-engine升级到了5.8.2,但将junit-platform-enginejunit-platform-commons固定在了1.7.2。经过一些实验,我打开了JUnit POM并发现5.8.2使用了1.8.2依赖项。这就是原因。始终检查相关依赖项是否同步!


谢谢 - 这让我找到了解决办法 - 不确定是怎么回事,但我的junit-platform-engine依赖项(通过传递方式引入)的版本比junit-jupiter-api高。确保它们具有相同的主/次版本号解决了我的问题。 - djchapm

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