如何使用构建脚本测试扩展类

时间:2013-06-17 14:11:09

标签: java unit-testing build classloader

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

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

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

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

有什么建议吗? 我也可以将构建脚本更改为Gradle,但我认为这不会产生影响。

1 个答案:

答案 0 :(得分:0)

一般答案

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

  1. 设置环境(例如,运行数据库安装脚本)
  2. 运行集成测试
  3. 清理步骤1中的所有内容
  4. 如果要在构建脚本中执行步骤1和3,或者如果要在测试类中对其进行编码,则必须做出决定,具体取决于您的需求。例如,您可能会发现一种方法更清洁,更便携。

    您案件的解决方案

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

    1. 编译主要代码
    2. 编译测试代码
    3. 运行单元测试(您的类型)
    4. 分叉新VM以运行集成测试。
    5. 如果您选择在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 integration或使用JavaExec task

      在这种情况下,我建议使用您的构建文件来运行测试,但如果您想在Java代码中使用evrything,并从测试类中派生新的JVM,则可以使用ProcessBuilder。除此之外,还需要阅读JAVA_HOME环境变量。