【问题标题】:Test dependencies for white-box unit testing Java modules with Maven and Eclipse使用 Maven 和 Eclipse 测试 Java 模块的白盒单元测试依赖项
【发布时间】:2020-04-13 05:21:01
【问题描述】:

我正在尝试将使用 Maven 和 Eclipse 的现有 Java 项目转换为 Java 9+ 模块。项目有单元测试,单元测试有测试依赖。我需要在测试代码中提供测试依赖项,但我不希望它们在已发布的模块中暴露给世界其他地方。

我认为Testing in the Modular World 很好地描述了 Maven 解决方案。总之,一种解决方案是在主源文件夹中创建一个module-info.java,在测试文件夹中创建另一个。主文件夹中的文件具有真正的依赖关系。 test 文件夹中的文件添加了测试依赖项。

该解决方案在 Maven 中运行良好,我可以从命令行构建和运行测试。但是,当我将项目作为 Maven 项目导入 Eclipse 时,它​​会犹豫。 Eclipse 抱怨“构建路径包含重复的条目模块信息”并拒绝构建项目。

在文章中使用包含--add-readsmodule-info.test 的其他建议解决方案无效,并且在Maven 和Eclipse 中构建都失败,因为测试找不到它们的依赖项。

为了使事情更复杂,我需要从 Maven 导入测试依赖项,但我还需要导入主代码不使用的标准 Java 模块。例如,一个单元测试依赖于java.httpserver 提供的内置 Web 服务器,由于它是 JDK 的一部分,所以对测试依赖项所做的任何魔术都会错过它。

是否有适用于 Maven 和 Eclipse(最新版本)的解决方案?这听起来像是一个很常见的问题,并且模块系统现在已经存在了一段时间。

请注意,我真的不想更改 Eclipse 中的项目设置。我可以摆弄 pom 文件中的插件,但添加一个手动例程,所有开发人员都需要手动编辑生成/导入的项目设置是不可行的。

编辑: 有一个开放的 Eclipse 错误报告,请参阅Eclipse bug 536847。似乎尚不支持,但也许有人可以提出解决方法?

【问题讨论】:

    标签: java eclipse maven junit java-module


    【解决方案1】:

    Maven 中每个项目的多类路径功能的 Eclipse 模拟已经被破坏了很长时间。症状是您可以使用测试依赖项来拥有非测试类。

    本质上 Eclipse 只是认为每个项目都有一个类路径而不是两个并行的类路径,这会导致这样的事情......不做正确的事情。

    我建议将每个有问题的项目一分为二。一种是实际来源,另一种是测试来源(取决于实际来源)。这将避免 Eclipse 错误,并允许您使用最新版本的 Java 进行测试,同时为旧版本的 Java 构建应用程序。

    【讨论】:

    • 这适用于集成测试和黑盒单元测试,但如果测试需要与被测类在同一个包中才能访问内部,它就会崩溃,至少在使用模块系统时是这样。另外,这意味着即使第二个测试失败,第一个 Maven 项目也可以成功构建。我对此有负面体验,并希望将测试保留在主项目中。
    • 那么我会建议从 Eclipse 切换。目前最好的 Java IDE 是 IntelliJ,免费的社区版应该可以做到这一点。
    • 好吧,我个人可以这样做,但在这里我们需要同时支持或至少支持公司标准 Eclipse。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2022-08-05
    • 2018-04-19
    • 2010-12-16
    • 2014-10-20
    相关资源
    最近更新 更多