org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests

8 浏览
0 Comments

org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests

我想在Gradle项目中实现一个Junit 5测试。我尝试了以下内容:

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!");

}

}

我尝试了这个,但还是不起作用。

0
0 Comments

原因:在将项目从JDK 11升级到JDK 17以及将junit-jupiter-api从5.7.0升级到5.8.2之后,出现了相同的问题。在该项目中,工作的版本是5.7.2。

解决方法:参考Github issue中的讨论。

代码示例:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MyTest {
    @Test
    public void test() {
        assertEquals(2, 1 + 1);
    }
}

问题的根源在于JUnit 5.8.0及更高版本的一个更改导致了这个问题。在JUnit 5.8.0之前,JUnit Jupiter引擎会自动加载和执行所有可见的测试类。但是在5.8.0及更高版本中,只有通过`@Test`注解明确标记为测试的类才会被加载和执行。

为了解决这个问题,可以采取以下两种解决方法之一:

1. 将JUnit Jupiter版本回退到5.7.2或更早的版本。在Maven项目中,可以在`pom.xml`文件中指定JUnit Jupiter的版本:


    
        org.junit.jupiter
        junit-jupiter-api
        5.7.2
    

2. 明确标记测试类和测试方法。在测试类和测试方法上添加`@Test`注解,以确保它们被加载和执行:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
@Test
public class MyTest {
    @Test
    public void test() {
        assertEquals(2, 1 + 1);
    }
}

通过以上两种方法之一,可以解决这个问题并成功发现和执行测试。

0
0 Comments

org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests

这个问题的出现原因可能是项目的结构不符合要求,解决方法是按照以下结构进行项目的组织:

project-dir
  -- src
     -- main
        -- java
            -- classes
     -- test
        -- java
            -- test-classes

另外,还要确保测试类的命名格式正确,可以参考以下答案中提到的命名规范:https://stackoverflow.com/a/70455369/10821123

0
0 Comments

在升级JUnit版本从5.7.0到5.8.2时,我遇到了这个问题。尝试使用版本5.7.0的org.junit.jupiter:junit-jupiter-apiorg.junit.jupiter:junit-jupiter-engine。同样的问题。我们知道5.8.2中的差异是什么导致了这个问题吗?谢谢,这对我很有帮助。这是我升级Spring Boot从2.5.10到2.6.5时的解决方案。是的,对我也有效,Eclipse版本为Version: 2022-03 (4.23.0) Build id: 20220310-1457,更改为5.7.0即可。谢谢!对我来说也适用于Intellij runner(Intellij Ultimate 2022.2.3)和Apache Ant 1.10.10。

0