使用Ivy下载JUnit供Ant使用

时间:2014-10-15 05:37:37

标签: java ant junit ivy

我有一个当前的私有Java项目,我试图让其他开发人员使用它。我尝试做的其中一件事就是让Ant自己下载JUnit,PMD和FindBugs等所需的JAR,这样开发人员就不必自己安装它。因此,我已经为所有这些事情卸载了RPM软件包(以确保我使用常春藤下载的版本)并且我已经让Ivy正常工作以下载与JUnit相关的JAR文件。但是,我有两个(可能是相关的)问题:

1)如果我为taskdef任务加了junit,我会收到警告Trying to override old definition of datatype junit。但是,如果我不这样做,我会收到错误:

failed to create task or type junit
Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found.

2)当我覆盖junit taskdef时,我在尝试运行JUnit测试时遇到此错误:

junit.framework.AssertionFailedError: No tests found

搜索该错误表示在4.x下运行时为JUnit 3.x编写的测试会发生这种情况。但是,我的JUnit测试全部使用4.x @Test方式进行测试,当我使用提供JUnit 4.11 JAR文件的RPM包时,测试运行得很好,Ivy下载的JUnit JAR文件是版本4.11对于JUnit和1.9.4用于ant-junit。使用(1.9.2)的Ant I安装的RPM软件包与Ivy(1.9.4)下载的Ant JAR文件不匹配,但我不认为这是问题所在。

我的junit taskdef是:

<taskdef name="junit"
    classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
        <classpath location="lib/ant-junit.jar"/>
        <classpath location="lib/junit.jar"/>
        <classpath location="lib/hamcrest-core.jar"/>
</taskdef>

在启用调试的情况下运行Ant会产生与此问题相关的输出:

Finding class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask
Loaded from /BlahBlah/lib/ant-junit.jar org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.class
Class org.apache.tools.ant.Task loaded from parent loader (parentFirst)
Class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask loaded from ant loader (parentFirst)
[...]
Class org.apache.tools.ant.util.FileUtils loaded from parent loader (parentFirst)
Could not load class (org.apache.tools.ant.taskdefs.optional.junit.JUnitTask) for type junit
Could not load class (org.apache.tools.ant.taskdefs.optional.junit.JUnitTask) for type junit
Trying to override old definition of datatype junit
 +Datatype junit org.apache.tools.ant.taskdefs.optional.junit.JUnitTask

那么,有什么方法可以解决这个问题吗?或者我应该采取完全不同的方法?

1 个答案:

答案 0 :(得分:1)

我建议使用常春藤配置来管理您的测试类路径。以下示例包含一个工作示例:

您的ivy文件包含一个依赖项,其配置映射为“test”:

<configurations>
    <conf name="compile" description="Required to compile application"/>
    <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
    <conf name="test"    description="Required for test only" extends="runtime"/>
</configurations>

<dependencies>
    ..
    ..

    <!-- test dependencies -->
    <dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
</dependencies>

构建文件创建使用常春藤配置填充的类路径:

<target name="resolve" depends="...." description="Use ivy to resolve classpaths">
    ..
    ..

    <ivy:cachepath pathid="test.path"    conf="test"/>
</target>

最后,junit任务使用此类路径

<target name="test" depends="compile-tests" description="Run unit tests">
    ..
    ..
    <junit printsummary="yes" haltonfailure="yes">
        <classpath>
            <path refid="test.path"/>
            <pathelement path="${classes.dir}"/>
            <pathelement path="${test.classes.dir}"/>
        </classpath>
        ..
        ..
    </junit>
</target>