当前位置: 首页 > 面试题库 >

如何打开包并仅对JUnit测试要求依赖于测试范围模块

卫嘉言
2023-03-14
问题内容

我正在将使用类路径的jar项目从java 10迁移到使用java 9拼图模块的java
11。该项目有JUnit5测试。测试依赖项由maven在测试范围内提供。当该模块被另一个项目使用时,如何使所有程序包打开以进行测试但不打开?

jar项目只是为其他项目提供了一些类(例如实用程序项目)(因此不需要主类)。

该项目在 / src / main / java / a / b / c /中
有5个软件包。使用此jar的项目应该可以访问其中的2个。其他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:无法访问abcpackage1.collections.SomeTest():模块moduleName不会“打开abcpackage1”到未命名的模块@
6a84a97d

当我打开包(带有 opens
)时,一切运行顺利。但是现在所有程序包都已打开。我希望仅在测试时才能访问包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;
}

现在行家(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
  • 模拟2.22.2

如前所述,我希望仅在测试期间可以访问包2、4和5,并且测试将在使用maven构建jar上运行。程序包1和程序包3应该导出以用于其他项目,但不要打开以进行反射(因此仅导出不打开)。

如果您需要其他信息,请随时询问。

提前致谢

凯文


问题答案:

“欢迎来到模块化世界中的测试”,凯文。

我在这里编译了有关该主题的博客:https : //github.com/sormuras/testing-in-the-modular-
world

基本上,当涉及白盒测试时,您需要在 测试编译测试运行时 调整模块系统,以允许测试框架绕过模块系统的障碍。

我猜,您的方向正确……也许Surefire做错了事?想要给我写过镜头的https://github.com/sormuras/junit-
platform-maven-plugin吗?该插件支持开箱即用的黑盒和白盒测试。特别是,当您提供test/java/module- info.java测试模块描述符时,此插件会发光。

请参见此“图片”,以了解如何在 接触主模块描述符的 情况下 组织模块化测试:

src ├── main │ └── java │ ├── foo │ │ ├── PackageFoo.java │ │ └── PublicFoo.java │ └── module-info.java <------------------ module foo { exports foo; } ├── test │ └── java .--- open module foo { │ ├── foo / exports foo; │ │ └── PackageFooTests.java / requires org.junit.jupiter.api; │ └── module- info.[java|test] <----< } └── it \ └── bar °---- --add-reads └── src foo=org.junit.jupiter.api └── test --add-opens └── java foo/foo=org.junit.platform.commons ├── bar │ └── PublicFooTests.java └── module-info.java <------ open module bar { requires foo; requires org.junit.jupiter.api; }

此模式也应该易于采用。



 类似资料:
  • 虽然应用程序启动良好,到目前为止没有检测到功能丢失,但由于多个(主要是重复的)错误,测试无法运行,例如: [..] com类型的依赖项不明确。fasterxml。杰克逊。数据绑定。ObjectMapper和限定符[@Named(value=“objMapper”)]-java成员:com。项目。存储库。MyDao#()-在类bean[types=[com.proj.repository.MyEla

  • 41.1 测试范围内的依赖 如果使用了spring-boot-starter-test“启动器”(scope为test),将得到以下库: JUnit —— Java程序单元测试事实上的标准 Spring Test & Spring Boot Test —— 工具类以及支持Spring Boot程序的集成测试 AssertJ —— 一个优美的断言库 http://hamcrest.org/JavaH

  • 问题内容: 我们的工具包具有15000多个JUnit测试,并且已知许多测试会在其他测试失败的情况下失败。例如,如果方法X.foo()使用Y.bar()中的功能并且YTest.testBar()失败,则XTest.testFoo()也将失败。显然,由于特定于X.foo()的问题,XTest.testFoo()也可能会失败。 尽管这很好并且我仍然希望两个测试都能运行,但是如果可以用指向XTest.te

  • 我试图用Jasmine为Angularjs编写单元测试。这是我的控制器: 和测试 测试失败,即使我试图测试期望(true). toBe(true); 茉莉花,因果报应,棱角分明的嘲弄都在我的索引里。jasmine调试页面中的html,还有测试脚本。 我发现如果删除beforeach()块,expect(true)。托比(真的)通过了。 下面是一个错误:

  • 对于 REST API 的测试部分。正在查看可以在Spring启动中使用的依赖项。我看到有JUnit依赖项和Spring启动器测试依赖项。 JUnit依赖项和Spring Boot启动器测试依赖项有什么区别?

  • 我试图从命令行显示我正在使用maven dependency插件版本3.1.2开发的项目的完整依赖关系树,但是目标(以及maven dependency插件中的任何其他目标)没有显示依赖关系。插件的文档(https://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html)声明默认情况下包含所有作用域,因此不需要使用-Dsc