在上面的建议中,很多重点是发明方法在运行时来传递变量,设置它们并清除它们等等..?但是为了“结构化”地测试事物,我猜你想为不同的场景提供不同的测试套件?很像你想运行“更重”的集成测试构建,而在大多数情况下,你只想跳过它们。但是,您不会尝试“发明在运行时设置内容的方法”,而只是告诉 maven 你想要什么?过去,告诉 maven 通过配置文件运行特定测试需要做很多工作,如果你在周围搜索别人会建议通过 springboot 进行测试(但如果你没有将 springboot monstrum 拖到你的项目中,这似乎很可怕'只是运行 JUnits' 的足迹,对吧?)。否则这将意味着或多或少不方便的 POM XML 杂耍负载,这也很烦人,让我们说,“九十年代的举动”,就像仍然坚持用“用 XML 制作春豆”一样不方便,炫耀你的 ultimate 600 行 logback.xml 之类的......?
现在,你可以只使用 Junit 5(这个例子是 maven 的,更多细节可以在这里找到JUnit 5 User Guide 5)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
然后在您最喜欢的实用程序库中创建一个简单的漂亮注释类,例如
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@EnabledIfEnvironmentVariable(named = "MAVEN_CMD_LINE_ARGS", matches = "(.*)integration-testing(.*)")
public @interface IntegrationTest {}
因此,每当您的 cmdline 选项包含 -Pintegration-testing 时,您的 @IntegrationTest 注释测试类/方法才会触发。或者,如果您不想使用(和设置)特定的 Maven 配置文件,而只是通过 'trigger' 系统属性传递
mvn <cmds> -DmySystemPop=mySystemPropValue
并调整您的注释界面以触发它(是的,还有一个@EnabledIfSystemProperty)。或者确保你的 shell 设置为包含“你需要的任何东西”,或者,正如上面所建议的,实际上通过你的 POM XML 添加系统环境是“痛苦的”。
让您的代码在内部在运行时摆弄 env 或模拟 env,设置它然后可能“清除”运行时 env 以在执行期间改变自身,这似乎是一种糟糕的,甚至可能是危险的方法- 很容易想象有人迟早会犯一个“隐藏的”内部错误,会在一段时间内被忽视,只是突然出现并在以后的生产中狠狠地咬你..?您通常更喜欢一种方法,即“给定输入”给出“预期输出”,随着时间的推移,这种方法很容易掌握和维护,您的程序员同事会“立即”看到它。
很长的“答案”,或者只是对您为什么更喜欢这种方法的看法(是的,起初我只是阅读了这个问题的标题并继续回答,即“如何测试代码依赖于使用 JUnit 的环境变量)。