如何打开包并要求仅针对 JUnit 测试的测试范围模块的依赖项
我正在使用classpath将一个jar项目从java 10迁移到使用java 9拼图模块的java 11。该项目有 JUnit5 测试。测试依赖项由 maven 在测试范围内提供。如何使所有包都打开以供测试,但在模块被另一个项目使用时不打开?
jar项目只是为其他项目提供了几个类(如实用程序项目)(因此不需要主类)。
该项目在 /src/main/java/a/b/c/ 上有 5 个包。其中 2 个应该可供使用此 jar 的项目访问。其他3个仅供内部使用(由可访问的供访问者使用)。测试位于 /src/test/java/a/b/c/。这些测试在测试范围内提供了依赖项(JUnit,mockito,junt-params),因为这些测试与使用此jar的项目无关
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
我在 /src/main/java/ 上提供了一个 module-info.java:
module moduleName {
requires java.base;
exports a.b.c.package1;
exports a.b.c.package3;
}
所以现在包1和3中的公共类应该可以像预期的那样被其他项目访问(我还没有能够验证这一点)。
运行测试现在会导致 java.lang.reflect.InaccessibleObjectException: 无法使 a.b.c.package1.collections.SomeTest() 可访问:module moduleName 不会“打开 a.b.c.package1”到未命名的模块@6a84a97d
当我打开包(打开)时,一切都运行顺利。但现在所有软件包现在都已打开。我希望包 2、4 和 5 只能在测试时访问,而 1 和 3 不应该打开进行反射(因此只能导出)。
我开始思考,由于maven告诉我未命名的模块@6a84a97d,这可能是一个为测试而创建的模块。这让我尝试在 /src/test/java/ 上添加一个 module-info.java 进行测试。
module moduleNameTest {
requires moduleName; // the code to test
requires java.base; // java.base could be transient on moduleName
// test dependencies
requires org.junit.jupiter.api;
requires org.junit.jupiter.params;
}
现在 maven (3.5.4) 指出:
src/test/java/module-info.java:[3,20] module not found: moduleName
src/test/java/module-info.java:[4,31] module not found: org.junit.jupiter.api
src/test/java/module-info.java:[5,31] module not found: org.junit.jupiter.params
技术:
- java openJDK 11
- mvn 3.5.4
- JUnit 5.3.0
- Surefire 插件 3.0.0-M3
- mockito 2.21.0
如前所述,我希望包 2、4 和 5 只能在测试时访问,并且测试将在使用 maven 构建 jar 时运行。包 1 和包 3 应导出以在其他项目中使用,但不能打开以进行反射(因此仅导出而不打开)。
如果您需要更多信息,请随时询问。
提前致谢
凯文