gpt4 book ai didi

java - 模块化项目中测试代码的实用打包

转载 作者:行者123 更新时间:2023-12-01 18:51:01 36 4
gpt4 key购买 nike

我一直在思考 Java 模块系统,并且有一个问题在这里没有得到解决。我又查了一下并找到了答案,所以我想我会发布这些信息,以防它缩短其他人的搜索时间。

传统上,测试保存在与项目代码主体分开的源代码树中,因此测试二进制文件很容易从生成的项目的最终可交付成果中分离出来。我不确定如何使用模块系统来实现这一点,但事实证明它仍然很容易。

我们(可能是多模块)模块项目的来源通常布局类似于 "sources/MyModule/src/main/java" 。然后我们将使用 --module-source-path 指定编译设置为"source/*/src/main/java" (请注意,引号很重要,否则您的操作系统将尝试扩展星号。您不希望这样,您想将其交给 javac )。如果source下还有其他模块,只要它们也具有相同的整体结构,只是名称不同,它们就会被找到并编译。但是,事实证明我们似乎能够将一个模块拆分到两棵树上。所以,这个源布局:

.
└── sources
├── ModOne
│   ├── java
│   │   ├── module-info.java
│   │   └── pkg
│   │   └── Prod.java
│   └── test
│   └── pkg
│   └── Test.java
└── ModTwo
└── java
├── module-info.java
└── p2
└── RunMe.java

使用此命令一次性正确编译: javac -d out --module-source-path "./sources/*/java:./sources/*/test" --module ModTwo,ModOne请注意,我没有指定 ModOne,测试部分不会被编译,但只要我明确这样做,就会找到它,并且输出会创建此目录树:

.
├── out
│   ├── ModOne
│   │   ├── module-info.class
│   │   └── pkg
│   │   ├── Prod.class
│   │   └── Test.class
│   └── ModTwo
│   ├── module-info.class
│   └── p2
│   └── RunMe.class

RunMe中的main方法是这样执行的: java --module-path out --module ModTwo/p2.RunMe实际上,我的 Test 类中有一个 main,它运行并成功地对 ModOne 的其余代码进行包级访问。

树中源文件的内容:

sources/ModOne/java/module-info.java: 
module ModOne {
exports pkg;
}

sources/ModOne/java/pkg/Prod.java:
package pkg;
public class Prod {
public static String name = "Fred";
}

sources/ModOne/test/pkg/Test.java:
package pkg;
public class Test {
public static void main(String [] args) {
System.out.println("Value is " + Prod.name);
}
}

sources/ModTwo/java/module-info.java:
module ModTwo {
requires ModOne;
}

sources/ModTwo/java/p2/RunMe.java:
package p2;
public class RunMe {
public static void main(String [] args) {
System.out.println("Pulling from ModOne I get name is " + pkg.Prod.name);
}
}

最佳答案

在现实生活中,还有更多内容,只需考虑您的测试源必须看到的测试框架(例如,junit),但您的主要源不应该访问它。

我在最近的题为“调整您的模块”的演示中将此用例作为我的主要示例:

简而言之:

  1. 主要和测试需要使用不同参数进行两次编译
  2. 依赖项的连接是通过 --patch-module--add-reads 等选项完成的。

好消息:Maven 或 Eclipse 等工具会自动为您完成大部分工作。

关于java - 模块化项目中测试代码的实用打包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59739173/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com