反射访问在IntelliJ IDEA中的模块化(Java 9+)应用程序的测试中不起作用

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

我有一个项目,在该项目中我使用对类的反射式访问(例如,通过Spring,还有其他人)。而且一切正常。现在我尝试添加module-info.java,突然我的测试无法使用反射找到我的生产代码在带有OpenJDK 11.0.2的IntelliJ IDEA Ultimate 2019.3中。我已将我的模块声明为“开放模块”。

  • 当我再次删除module-info.java时效果很好
  • 当我运行不需要反射访问的测试时,它工作正常
  • 当我使用Maven运行测试时,效果很好(据我所知)

为了进行复制,我按照以下步骤设置了一个新项目,但仍然无法正常工作:


一个基本上有两个文件的简单项目:

  • src / com / stackoverflow / test / Main.java(基本上是任何类)
  • test / com / stackoverflow / test / MainTest.java

MainTest.java包含以下两个均通过的简单测试:

package com.stackoverflow.test;
imports...
public class MainTest {
    @Test
    public void testingAccess() {
        var actual = new Main();
        assertNotNull(actual);
    }

    @Test
    public void testingReflections() {
        Set<String> allClasses = new Reflections("com.stackoverflow.test", new SubTypesScanner(false)).getAllTypes();
        for (String oneClass : allClasses) {
            System.out.println(oneClass);
        }
        assertEquals(2, allClasses.size());
    }
}

[当我现在添加具有以下内容的src/module-info.java时,第二个测试testingReflections()在IntelliJ IDEA中失败,因为它仅找到“ MainTest”。

open module com.stackoverflow.test {
    exports com.stackoverflow.test;
}

如何在测试中启用对IDEA中生产代码的反射访问?

java intellij-idea java-9 java-module
1个回答
0
投票

您的案例似乎与2019.3(https://youtrack.jetbrains.com/issue/IDEA-171419)中的模块化系统修复有关,它允许运行模块感知的测试。请考虑以下不同的解决方法:

  • 在模块信息中导出所需的模块;
  • 将导出添加到运行配置;
  • 使用其自身的模块信息创建专用的测试模块。

也请考虑以下问题:https://youtrack.jetbrains.com/issue/IDEA-222831(支持module-info.test配置文件)。

这是关于类似问题的讨论:https://youtrack.jetbrains.com/issue/IDEA-228999

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