无法在Mac上找到JUnit

时间:2013-06-15 22:14:34

标签: xml ant junit cobertura

所以我试图从this教程构建一个项目。我运行ant,并得到错误。我看到的第一件事是     ...错误:包junit.framework不存在         [javac] import junit.framework.TestCase; 该教程对可能的错误非常不确定。它只是说我可能没有安装JUnit。我正在运行最新版本的Java,我认为它与JUnit一起提供。所以问题就是找到它(或者至少确认它存在)并将其添加到构建文件中。我怎么做?

在build.xml     

<project name="cobertura.examples.basic" default="coverage" basedir=".">

    <description>
    Cobertura - http://cobertura.sourceforge.net/
    Copyright (C) 2003 jcoverage ltd.
    Copyright (C) 2005 Mark Doliner &lt;thekingant@users.sourceforge.net&gt;
    Copyright (C) 2006 Dan Godfrey
    Cobertura is licensed under the GNU General Public License
    Cobertura comes with ABSOLUTELY NO WARRANTY
    </description>

    <property file="build.properties" />

    <path id="cobertura.classpath">
        <fileset dir="${cobertura.dir}">
            <include name="cobertura.jar" />
            <include name="lib/**/*.jar" />
        </fileset>
    </path>
    <taskdef classpathref="cobertura.classpath" resource="tasks.properties"/>

    <target name="init">
        <mkdir dir="${classes.dir}" />
        <mkdir dir="${instrumented.dir}" />
        <mkdir dir="${reports.xml.dir}" />
        <mkdir dir="${reports.html.dir}" />
        <mkdir dir="${coverage.xml.dir}" />
        <mkdir dir="${coverage.summaryxml.dir}" />
        <mkdir dir="${coverage.html.dir}" />
    </target>

    <target name="compile" depends="init">
        <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="yes">
            <classpath refid="cobertura.classpath" />
        </javac>
    </target>

    <target name="instrument" depends="init,compile">
        <!--
            Remove the coverage data file and any old instrumentation.
        -->
        <delete file="cobertura.ser"/>
        <delete dir="${instrumented.dir}" />

        <!--
            Instrument the application classes, writing the
            instrumented classes into ${build.instrumented.dir}.
        -->
        <cobertura-instrument todir="${instrumented.dir}">
            <!--
                The following line causes instrument to ignore any
                source line containing a reference to log4j, for the
                purposes of coverage reporting.
            -->
            <ignore regex="org.apache.log4j.*" />

            <fileset dir="${classes.dir}">
                <!--
                    Instrument all the application classes, but
                    don't instrument the test classes.
                -->
                <include name="**/*.class" />
                <exclude name="**/*Test.class" />
            </fileset>
        </cobertura-instrument>
    </target>

    <target name="test" depends="init,compile">
        <junit fork="yes" dir="${basedir}" failureProperty="test.failed">
            <!--
                Note the classpath order: instrumented classes are before the
                original (uninstrumented) classes.  This is important.
            -->
            <classpath location="${instrumented.dir}" />
            <classpath location="${classes.dir}" />

            <!--
                The instrumented classes reference classes used by the
                Cobertura runtime, so Cobertura and its dependencies
                must be on your classpath.
            -->
            <classpath refid="cobertura.classpath" />

            <formatter type="xml" />
            <test name="${testcase}" todir="${reports.xml.dir}" if="testcase" />
            <batchtest todir="${reports.xml.dir}" unless="testcase">
                <fileset dir="${src.dir}">
                    <include name="**/*Test.java" />
                </fileset>
            </batchtest>
        </junit>

        <junitreport todir="${reports.xml.dir}">
            <fileset dir="${reports.xml.dir}">
                <include name="TEST-*.xml" />
            </fileset>
            <report format="frames" todir="${reports.html.dir}" />
        </junitreport>
    </target>

    <target name="coverage-check">
        <cobertura-check branchrate="34" totallinerate="100" />
    </target>

    <target name="coverage-report">
        <!--
            Generate an XML file containing the coverage data using
            the "srcdir" attribute.
        -->
        <cobertura-report srcdir="${src.dir}" destdir="${coverage.xml.dir}" format="xml" />
    </target>

    <target name="summary-coverage-report">
        <!--
            Generate an summary XML file containing the coverage data using
            the "srcdir" attribute.
        -->
        <cobertura-report srcdir="${src.dir}" destdir="${coverage.summaryxml.dir}" format="summaryXml" />
    </target>

    <target name="alternate-coverage-report">
        <!--
            Generate a series of HTML files containing the coverage
            data in a user-readable form using nested source filesets.
        -->
        <cobertura-report destdir="${coverage.html.dir}">
            <fileset dir="${src.dir}">
                <include name="**/*.java"/>
            </fileset>
        </cobertura-report>
    </target>

    <target name="clean" description="Remove all files created by the build/test process.">
        <delete dir="${classes.dir}" />
        <delete dir="${instrumented.dir}" />
        <delete dir="${reports.dir}" />
        <delete file="cobertura.log" />
        <delete file="cobertura.ser" />
    </target>

    <target name="coverage" depends="compile,instrument,test,coverage-report,summary-coverage-report,alternate-coverage-report" description="Compile, instrument ourself, run the tests and generate JUnit and coverage reports."/>

</project>

1 个答案:

答案 0 :(得分:2)

当您为Mac获取最新的JDK时,确实没有获得JUnit。

http://junit.org下载并安装最新的junit.jar,并配置ant以查找它会对您有所帮助,您可能最好通过在线学习Junit来自JUnit页面,而不是从非常短的cobertura教程线上。这些文档有一个下载和安装指南,非常好(假设您知道类路径是什么),以及一个超级小的演练来帮助您入门。

你不会认为类junit.framework.TestCase是JUnit版本3的一部分,它现在已经非常了。除非你有遗留代码可以使用,否则你可能需要先学习JUnit 4,它已存在很多年了。

还有其他方法可以使用JUnit。您的IDE可能已经有一个JUnit插件。另一种方法是使用Maven。通过在maven项目文件中指定junit,maven将自动获取并安装junit。 Maven非常复杂,但是一旦习惯了它,你可能会将它用于所有的Java应用程序。

<强>附录

以下是使用适用于Mac的Maven和JUnit的完整示例。您需要自己安装的就是JDK和Maven。完成后,为新项目创建一个目录,并只创建三个文件:

  • PROJECT_ROOT / pom.xml的
  • PROJECT_ROOT / SRC /主/ JAVA / COM /示例/ Pair.java
  • PROJECT_ROOT / SRC /测试/ JAVA / COM /示例/ PairTest.java

这是pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>pairs</artifactId>
  <version>1.0</version>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

这是Pair.java

package com.example;
class Pair {
    int x, y;
    public Pair(int x, int y) {this.x = x; this.y = y;}
    public int getX() {return x;}
    public int getY() {return y;}
    @Override public String toString() {return String.format("(%d,%d)", x, y);}
}

这里是PairTest.java

package com.example;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Test;

public class PairTest {

    @Test
    public void gettersWork() {
        Pair p = new Pair(4, 6);
        assertThat(p.getX(), is(4));
        assertThat(p.getY(), is(6));
        assertThat(p.toString(), is("(4,6)"));
    }
}

现在,从您的项目根目录,只需输入

即可
mvn test

一切都应该有效。请注意,第一次运行maven时,可能需要大约4分钟才能下载数以万亿计的内容。别担心,这是正常的。它会为你取junit。

您应该看到的最后几行是:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.example.PairTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.308 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

希望有所帮助。