首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用常春藤下载JUnit供Ant使用

使用常春藤下载JUnit供Ant使用
EN

Stack Overflow用户
提问于 2014-10-15 05:37:37
回答 1查看 1.8K关注 0票数 1

我有一个当前私有的Java项目,我正在努力使其成形,供其他开发人员使用。我想要做的一件事是让Ant自己下载JUnit、PMD和FindBugs这样的东西所需的JAR,这样开发者就不用自己安装了。因此,我已经为所有这些事情卸载了RPM包(以确保我使用的是常春藤下载的版本),我让Ivy能够很好地下载与JUnit相关的JAR文件。然而,我遇到了两个(可能相关的)问题:

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

代码语言:javascript
复制
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测试时,会得到这个错误:

代码语言:javascript
复制
junit.framework.AssertionFailedError: No tests found

搜索该错误时表示,它发生在运行在4.x下时为JUnit 3.x编写的测试中。但是,我的JUnit测试都使用4.x @Test进行测试,当我使用RPM包提供的JUnit 4.11 JAR文件时,测试运行得很好,Ivy下载的JUnit JAR文件分别是JUnit的4.11版本和ant-junit的1.9.4版本。我使用的已安装的RPM包(1.9.2)与Ivy下载的Ant JAR文件(1.9.4)不匹配,但我认为这不是问题所在。

我的junit任务是:

代码语言:javascript
复制
<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会产生与此问题相关的输出:

代码语言:javascript
复制
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

有什么办法能解决这个问题吗?还是我应该采取完全不同的方法?

EN

回答 1

Stack Overflow用户

发布于 2014-10-15 20:25:50

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

您的常春藤文件包含一个依赖项,其配置映射为"test":

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<target name="resolve" depends="...." description="Use ivy to resolve classpaths">
    ..
    ..

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

最后,junit任务使用这个类路径。

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26375186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档