【问题标题】:TestEngine with ID 'junit-jupiter' failed to discover tests - Caused by: org.junit.platform.commons.JUnitException: ClassSelector resolution failedID 为“junit-jupiter”的 TestEngine 未能发现测试 - 原因:org.junit.platform.commons.JUnitException:ClassSelector 解析失败
【发布时间】:2021-05-19 12:01:48
【问题描述】:

我在运行集成测试时遇到问题。

作为我的测试的一部分,我使用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 的参数,以便我可以跳过单元测试。

运行输出: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$0(ClassSelectorResolver.java:71)
    at org.junit.jupiter.engine.discovery.ClassSelectorResolver$$Lambda$61/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$2(EngineDiscoveryRequestResolution.java:134)
    at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$$Lambda$47/0000000000000000.apply(Unknown Source)
    at java.util.stream.ReferencePipeline$3$1.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

测试类大致是:

@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 {
        ...
    }

}

任何帮助将不胜感激。

【问题讨论】:

  • 你的测试类有@Test注解吗?
  • @hfontanez 是的,我会更新问题
  • @hfontanez 我已经看过了,这是杰克逊错误,对于junit-vintage
  • 从 Intellij 运行测试时它可以工作,如果我运行 mvn failsafe:integration-test
  • 请在 GitHub 上分享 MCVE,这只是一个重现该问题的最小项目。

标签: java maven junit junit5


【解决方案1】:

我认为最好的方法是点击 File->InvalidateCaches/Restart...

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

我认为问题出在以下几个方面。我认为没有足够的信息来确定它,但我想为您提供所有探索的途径,但要发表一个大评论太多了。

我已经按照复杂程度列出了它们。

  1. 您尚未完全设置自定义集成测试

有一些相关信息可以帮助您配置您的个人资料并在此处使用它们:Spring-boot default profile for integration tests

  1. @ActiveProfiles 表示配置文件名称为“integration”,但您的配置文件名称为“integration-test”

如果是这样,那么只需将注释更新为集成测试即可。

  1. 您的其中一个注释的配置不正确,或者类路径设置不正确,无法识别注释。

我不熟悉如何选择显示名称生成器,但有一条线对我来说是最接近的抱怨点。堆栈跟踪中的行是: org.junit.jupiter.engine.descriptor.DisplayNameUtils.determineDisplayName(DisplayNameUtils.java:68)

我相信这是支持这一行的正确代码:http://www.howsoftworks.net/junjupen/DisplayNameUtils#determineDisplayName-AnnotatedElement-Supplier

它似乎正在评估整个类的注释以试图撤回这一类。但是,上面您没有配置 DisplayName 注释,所以我认为这不是 DisplayName 的问题,而是其他一个问题。

进一步查看堆栈,它似乎正在尝试利用/缓存类本身的注释。这可能会导致注释缓存在此时评估类上的所有条目,而 displayName 只是第一个被请求的条目。

在这种情况下,它可能会因为您没有正确配置的其他注释之一而绊倒。 ArrayStore 异常让我想知道您是否将元素放在了数组应该放在的位置,反之亦然。

但是,进一步研究,这个错误(AnnotationParser 中的第 724 行)似乎与一组 JDK 问题有关,这些问题已在其中一个 JDK-11 版本中得到适当修复。在其他地方表示为“sun.reflect.annotation.TypeNotPresentExceptionProxy”。

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-7183985

这些错误的要点与引用不在类路径中的类的注释有关(类型不存在)。这可能是您的配置中的一个注释发生的情况,但从发布的信息来看,我们不太可能建议哪一个。

升级到已修复此问题的 JDK 可能会通过为您报告具有特定缺失类型信息的更好错误来帮助您更好地查明根本问题。如果这是一个选项,您也可以选择这样做。

根本问题可能是您的新配置文件环境导致错误配置,意外排除了您需要使测试中的注释保持一致的类。

【讨论】:

  • 这是非常好的信息。我不确定这是否会解决 OPs 问题,因为他没有回应,但无论如何我都会奖励你。
  • 感谢您的奖励。我希望它有帮助!我很好奇 OP 也能做出回应并确认是否有。
【解决方案3】:

尝试通过这样的命令传递配置文件:

mvn clean verify -Dspring.profiles.active=integration-test

【讨论】:

  • 亚历杭德罗,我正在寻找一个规范的答案。从本质上讲,OP 正在寻找答案,而我对稍微不同的答案很感兴趣,因为我的问题虽然相关,但并不相同,因此需要更深入地了解根本原因才能解决我的问题.如果您可以扩展您的答案,那可能就是我们俩都在寻找的。此链接应该可以帮助您了解什么是规范答案:meta.stackoverflow.com/a/291994/2851311
猜你喜欢
  • 2022-01-23
  • 2021-08-06
  • 2018-12-07
  • 2020-08-08
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
相关资源
最近更新 更多