ID 为 'junit-jupiter' 的 TestEngine 未能发现测试 - 原因:org.junit.platform.commons.JUnitException:ClassSelector 解析失败
TestEngine with ID 'junit-jupiter' failed to discover tests - Caused by: org.junit.platform.commons.JUnitException: ClassSelector resolution failed
我在集成测试中遇到问题运行。
作为我测试的一部分,我使用 exec-maven-plugin
从源代码管理中拉下其他项目,然后 运行 在本地将它们 运行 以便我的测试可以使用它来执行。
我对 JUnit 的 Maven 依赖项是:
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<useModulePath>false</useModulePath>
<useSystemClassLoader>false</useSystemClassLoader>
<skipTests>false</skipTests>
<includes>
<include>**/*IntegrationTest.java</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.4.2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
我创建了一个名为 integration-test
的配置文件,以便我可以选择何时启用集成测试,并且还向 maven-surefire-plugin
添加了一个名为 skipUTs
的参数,这样我就可以跳过单元测试。
运行ning 的输出:mvn clean verify -Pintegration-test -DskipUTs=true
org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:111)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:85)
at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:92)
at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:67)
at org.apache.maven.surefire.junitplatform.TestPlanScannerFilter.accept(TestPlanScannerFilter.java:56)
at org.apache.maven.surefire.api.util.DefaultScanResult.applyFilter(DefaultScanResult.java:102)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.scanClasspath(JUnitPlatformProvider.java:147)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:428)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:562)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:548)
Caused by: org.junit.platform.commons.JUnitException: ClassSelector [className = 'com.farmlandbee.app.integration.IntegrationTest'] 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:45)
at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:103)
... 11 more
Caused by: java.lang.ArrayStoreException
at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724)
at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531)
at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355)
at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286)
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120)
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72)
at java.lang.Class.getAnnotationCache(Class.java:2535)
at java.lang.Class.getDeclaredAnnotation(Class.java:2221)
at org.junit.platform.commons.util.AnnotationUtils.findAnnotation(AnnotationUtils.java:128)
at org.junit.platform.commons.util.AnnotationUtils.findAnnotation(AnnotationUtils.java:115)
at org.junit.jupiter.engine.descriptor.DisplayNameUtils.determineDisplayName(DisplayNameUtils.java:68)
at org.junit.jupiter.engine.descriptor.JupiterTestDescriptor.<init>(JupiterTestDescriptor.java:69)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.<init>(ClassBasedTestDescriptor.java:94)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.<init>(ClassTestDescriptor.java:51)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver.newClassTestDescriptor(ClassSelectorResolver.java:119)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver.lambda$resolve[=13=](ClassSelectorResolver.java:71)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver$$Lambda/0000000000000000.apply(Unknown Source)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$DefaultContext.createAndAdd(EngineDiscoveryRequestResolution.java:246)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$DefaultContext.addToParent(EngineDiscoveryRequestResolution.java:209)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:71)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve(EngineDiscoveryRequestResolution.java:134)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$$Lambda/0000000000000000.apply(Unknown Source)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1359)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:514)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:501)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:487)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:241)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:531)
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)
... 16 more
测试Class大致是:
@SpringBootTest(classes = Application.class,
webEnvironment = WebEnvironment.RANDOM_PORT)
@Import({SSLRestTemplateConfig.class})
@ExtendWith(SpringExtension.class)
@ActiveProfiles(profiles = {"integration"})
public class IntegrationTest {
@LocalServerPort
private int port;
private final RestTemplate restTemplate;
@Spy
private final Service Service;
private final IQueue<String> queue;
@Captor
ArgumentCaptor<String> captor;
@Autowired
public IntegrationTest(RestTemplate restTemplate,
Service service,
HazelcastInstance hazelcastInstance) {
this.restTemplate = restTemplate;
this.service = accountingQueueService;
this.queue = hazelcastInstance.getQueue("queue");
}
@BeforeEach
public void setup() {
queue.clear();
}
@Test
public void IntegrationTest() throws InterruptedException {
...
}
}
如有任何帮助,我们将不胜感激。
尝试通过这样的命令传递配置文件:
mvn clean verify -Dspring.profiles.active=integration-test
我认为问题出在以下方面之一。我认为没有足够的信息来确定它,但我想为您提供所有探索的途径,而且要发表一个重要的评论太多了。
我按照复杂程度列出了它们。
- 您还没有完全设置您的自定义集成测试
这里有相关信息可以帮助您配置个人资料并加以利用:
- @ActiveProfiles 表示配置文件名称为“集成”,但您的配置文件名称为“集成测试”
如果是这样,那么只需将注释更新为集成测试即可。
- 您的注释之一的配置不正确或 class 路径设置不正确以允许识别注释。
我不熟悉如何选择显示名称生成器,但有一行对我来说是最接近审查的抱怨点。堆栈跟踪中的行是:
org.junit.jupiter.engine.descriptor.DisplayNameUtils.determineDisplayName(DisplayNameUtils.java:68)
我相信这是支持这一行的正确代码:http://www.howsoftworks.net/junjupen/DisplayNameUtils#determineDisplayName-AnnotatedElement-Supplier
它似乎正在评估整个 class 的注释以尝试撤回此注释。但是,上面您没有配置 DisplayName 注释,所以我认为这不是 DisplayName 的问题,而是其他之一的问题。
进一步查看堆栈,它似乎正试图 utilize/cache class 本身的注释。这可能会导致注释缓存此时评估 class 上的所有条目,而 displayName 只是第一个被请求的条目。
在这种情况下,它可能会因您没有正确配置的其他注释之一而出错。 ArrayStore 异常让我想知道您是否将元素放在数组应该放在的位置,反之亦然。
但是,进一步研究发现,此错误(AnnotationParser 中的第 724 行)似乎与一系列 JDK 问题有关,这些问题已在 JDK-11 版本中得到妥善修复。它在其他地方表示为“sun.reflect.annotation.TypeNotPresentExceptionProxy”。
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-7183985
这些错误的要点与引用不在 class 路径(类型不存在)中的 class 的注释有关。这可能是您配置中的注释之一发生的情况,但根据发布的信息,我们不太可能建议是哪一个。
升级到已修复此问题的 JDK 可能会通过使用特定缺失类型信息为您报告更好的错误来帮助您更好地查明根本问题。如果这是一个选项,您也可以选择这样做。
根本问题可能是您的新配置文件环境导致错误配置,该错误配置意外排除了 class,您需要使测试中的注释保持一致。
我认为最好的方法是单击文件->InvalidateCaches/Restart...
我在集成测试中遇到问题运行。
作为我测试的一部分,我使用 exec-maven-plugin
从源代码管理中拉下其他项目,然后 运行 在本地将它们 运行 以便我的测试可以使用它来执行。
我对 JUnit 的 Maven 依赖项是:
<plugins>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<useModulePath>false</useModulePath>
<useSystemClassLoader>false</useSystemClassLoader>
<skipTests>false</skipTests>
<includes>
<include>**/*IntegrationTest.java</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.4.2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
我创建了一个名为 integration-test
的配置文件,以便我可以选择何时启用集成测试,并且还向 maven-surefire-plugin
添加了一个名为 skipUTs
的参数,这样我就可以跳过单元测试。
运行ning 的输出:mvn clean verify -Pintegration-test -DskipUTs=true
org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:111)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:85)
at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:92)
at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:67)
at org.apache.maven.surefire.junitplatform.TestPlanScannerFilter.accept(TestPlanScannerFilter.java:56)
at org.apache.maven.surefire.api.util.DefaultScanResult.applyFilter(DefaultScanResult.java:102)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.scanClasspath(JUnitPlatformProvider.java:147)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:428)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:562)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:548)
Caused by: org.junit.platform.commons.JUnitException: ClassSelector [className = 'com.farmlandbee.app.integration.IntegrationTest'] 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:45)
at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:69)
at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:103)
... 11 more
Caused by: java.lang.ArrayStoreException
at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724)
at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531)
at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355)
at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286)
at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120)
at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72)
at java.lang.Class.getAnnotationCache(Class.java:2535)
at java.lang.Class.getDeclaredAnnotation(Class.java:2221)
at org.junit.platform.commons.util.AnnotationUtils.findAnnotation(AnnotationUtils.java:128)
at org.junit.platform.commons.util.AnnotationUtils.findAnnotation(AnnotationUtils.java:115)
at org.junit.jupiter.engine.descriptor.DisplayNameUtils.determineDisplayName(DisplayNameUtils.java:68)
at org.junit.jupiter.engine.descriptor.JupiterTestDescriptor.<init>(JupiterTestDescriptor.java:69)
at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.<init>(ClassBasedTestDescriptor.java:94)
at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.<init>(ClassTestDescriptor.java:51)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver.newClassTestDescriptor(ClassSelectorResolver.java:119)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver.lambda$resolve[=13=](ClassSelectorResolver.java:71)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver$$Lambda/0000000000000000.apply(Unknown Source)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$DefaultContext.createAndAdd(EngineDiscoveryRequestResolution.java:246)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$DefaultContext.addToParent(EngineDiscoveryRequestResolution.java:209)
at org.junit.jupiter.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:71)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolve(EngineDiscoveryRequestResolution.java:134)
at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$$Lambda/0000000000000000.apply(Unknown Source)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1359)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:514)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:501)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:487)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:241)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:531)
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)
... 16 more
测试Class大致是:
@SpringBootTest(classes = Application.class,
webEnvironment = WebEnvironment.RANDOM_PORT)
@Import({SSLRestTemplateConfig.class})
@ExtendWith(SpringExtension.class)
@ActiveProfiles(profiles = {"integration"})
public class IntegrationTest {
@LocalServerPort
private int port;
private final RestTemplate restTemplate;
@Spy
private final Service Service;
private final IQueue<String> queue;
@Captor
ArgumentCaptor<String> captor;
@Autowired
public IntegrationTest(RestTemplate restTemplate,
Service service,
HazelcastInstance hazelcastInstance) {
this.restTemplate = restTemplate;
this.service = accountingQueueService;
this.queue = hazelcastInstance.getQueue("queue");
}
@BeforeEach
public void setup() {
queue.clear();
}
@Test
public void IntegrationTest() throws InterruptedException {
...
}
}
如有任何帮助,我们将不胜感激。
尝试通过这样的命令传递配置文件:
mvn clean verify -Dspring.profiles.active=integration-test
我认为问题出在以下方面之一。我认为没有足够的信息来确定它,但我想为您提供所有探索的途径,而且要发表一个重要的评论太多了。
我按照复杂程度列出了它们。
- 您还没有完全设置您的自定义集成测试
这里有相关信息可以帮助您配置个人资料并加以利用:
- @ActiveProfiles 表示配置文件名称为“集成”,但您的配置文件名称为“集成测试”
如果是这样,那么只需将注释更新为集成测试即可。
- 您的注释之一的配置不正确或 class 路径设置不正确以允许识别注释。
我不熟悉如何选择显示名称生成器,但有一行对我来说是最接近审查的抱怨点。堆栈跟踪中的行是: org.junit.jupiter.engine.descriptor.DisplayNameUtils.determineDisplayName(DisplayNameUtils.java:68)
我相信这是支持这一行的正确代码:http://www.howsoftworks.net/junjupen/DisplayNameUtils#determineDisplayName-AnnotatedElement-Supplier
它似乎正在评估整个 class 的注释以尝试撤回此注释。但是,上面您没有配置 DisplayName 注释,所以我认为这不是 DisplayName 的问题,而是其他之一的问题。
进一步查看堆栈,它似乎正试图 utilize/cache class 本身的注释。这可能会导致注释缓存此时评估 class 上的所有条目,而 displayName 只是第一个被请求的条目。
在这种情况下,它可能会因您没有正确配置的其他注释之一而出错。 ArrayStore 异常让我想知道您是否将元素放在数组应该放在的位置,反之亦然。
但是,进一步研究发现,此错误(AnnotationParser 中的第 724 行)似乎与一系列 JDK 问题有关,这些问题已在 JDK-11 版本中得到妥善修复。它在其他地方表示为“sun.reflect.annotation.TypeNotPresentExceptionProxy”。
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-7183985
这些错误的要点与引用不在 class 路径(类型不存在)中的 class 的注释有关。这可能是您配置中的注释之一发生的情况,但根据发布的信息,我们不太可能建议是哪一个。
升级到已修复此问题的 JDK 可能会通过使用特定缺失类型信息为您报告更好的错误来帮助您更好地查明根本问题。如果这是一个选项,您也可以选择这样做。
根本问题可能是您的新配置文件环境导致错误配置,该错误配置意外排除了 class,您需要使测试中的注释保持一致。
我认为最好的方法是单击文件->InvalidateCaches/Restart...