0

我创建了一个模块,用于使用Java Extension Mechanism部署为 JDK 扩展;我正在使用 ANT 构建模块。

有什么方法可以让我在构建过程中运行我的单元测试(使用 TestNG)?

问题是这个模块有两种类型的测试:

  • 可以使用 TestNG 的正常使用进行测试的功能测试。(好吧,我对这个单元测试没有任何问题)。
  • SPI 类的测试只能在将 jar 文件部署为扩展(因此引导类加载器)后才能看到它们。

有什么建议吗?我也可以将构建脚本更改为 Gradle,但我认为这没有什么不同。

4

1 回答 1

0

一般回答

您提到的第二种类型的测试是集成测试。这些总是有点难写,因为它们需要正确设置应用程序所在的环境。通常,需要三个步骤:

  1. 设置环境(例如运行数据库安装脚本)
  2. 运行集成测试
  3. 清理步骤 1 中的所有内容

您必须决定是要在构建脚本中执行步骤 1 和 3,还是要在测试类中对其进行编码,具体取决于您的需求。例如,您可能会发现一种方法更清洁、更便携。

适合您的情况的解决方案

在您的情况下,步骤“1 - 设置环境”要求您使用java.ext.dirs正确设置环境变量的新 Java VM,并且对于步骤“3 - 清理”,您只需确保分叉的 JVM 终止。您的构建文件将如下所示:

  1. 编译主代码
  2. 编译测试代码
  3. 运行单元测试(你的类型之一)
  4. 派生新 VM 以运行集成测试。

如果您选择在 Ant 中执行此操作,“运行集成测试”将如下所示:

<target name="extensionIntegrationTest">
  <java classname="your.integration.TestClass" fork="true" failonerror="true">
    <classpath refid="..." />
    <arg value="..." />
    <!-- ... more parameters -->
    <jvmarg value="-Djava.ext.dirs=path/to/your/extension.jar"/
  </java>
</target>

另请查看 Ant Java任务的文档。如果您正在切换到 Gradle(通常是一个非常好的主意),您可以使用 Gradle 的深度Ant 集成或使用JavaExectask

在这种情况下,我建议使用您的构建文件来运行测试,但是如果您想在您的 Java 代码中包含所有内容,并从您的测试类中派生一个新的 JVM,您将使用ProcessBuilder。除其他外,这将需要读取JAVA_HOME环境变量。

于 2013-06-17T19:13:22.213 回答