首页 > 解决方案 > 使用 Maven 和 Eclipse 测试 Java 模块的白盒单元测试依赖项

问题描述

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

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

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

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

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

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

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

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

标签: javaeclipsemavenjunitjava-module

解决方案


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

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

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


推荐阅读