Apache Ant:使用Junit

时间:2015-11-20 15:24:36

标签: java ant junit

我似乎无法通过Ant运行我的junit测试。这是我的设置:

的build.xml http://pastebin.com/c7n4cdJ6

我想做什么?我分别运行ant mainant packagecompile目标编译我的代码。首先是我的webapp的类,然后是我的测试类:

  1. javac:source:webapp java files,destination:${web.classes.dir}
  2. javac:source:test java files,destination:${web.testclasses.dir}
  3. 对于依赖关系管理,我使用Apache Ivy,它工作正常。

    因此,让我们来看看我的junit目标。您可以看到类路径是在junit.classpath中定义的。它包含:

    1. 我的Ivy与测试范围的依赖关系:<path refid="test.path"/>
    2. 我的测试的已编译类文件:<pathelement location="${web.testclasses.dir}"/>
    3. 我的webapp的已编译类文件:<pathelement location="${web.classes.dir}"/>
    4. 它还包含dirset我编译的测试类(你看我绝望了)。
    5. 因此,当我运行ant脚本编译得很好时,类文件就在那里。但是当谈到junit目标并且正在执行第一个测试时,我在控制台中出现了这个错误:

          [junit] Running CreateStopwordSqliteDBTest
          [junit] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 sec
      
      BUILD FAILED
      

      在结果xml文件中,我得到了更多信息:

        <error message="CreateStopwordSqliteDBTest (wrong name: de/mycompany/myproduct/CreateStopwordSqliteDBTest)" type="java.lang.NoClassDefFoundError">
          java.lang.NoClassDefFoundError: CreateStopwordSqliteDBTest (wrong name: de/mycompany/myproduct/CreateStopwordSqliteDBTest)
          at java.lang.ClassLoader.defineClass1(Native Method)
          at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
          at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
          at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
          at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
          at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
          at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
          at java.security.AccessController.doPrivileged(Native Method)
          at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
          at java.lang.Class.forName0(Native Method)
          at java.lang.Class.forName(Class.java:191)
      </error>
      

      NoClassDefFoundError告诉我,类可以在编译时找到,但不能在运行时找到。请注意,受影响的类是实际的JUnit测试。即使我确定它是我的junit类路径的一部分,为什么不能找到它?

      Fyi:当我从build.xml(我的junit类路径中的dirset)中删除第131行 - 133行时,我会得到一个ClassNotFoundException

        <error message="CreateStopwordSqliteDBTest" type="java.lang.ClassNotFoundException">
          java.lang.ClassNotFoundException: CreateStopwordSqliteDBTest
          at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
          at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
          at java.security.AccessController.doPrivileged(Native Method)
          at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
          at java.lang.Class.forName0(Native Method)
          at java.lang.Class.forName(Class.java:191)
      </error>
      

      你能帮助我吗?

1 个答案:

答案 0 :(得分:1)

源目录错误。以下是正确的属性:

<property name="src.dir" location="${basedir}/src" />
<property name="testsrc.dir" location="${basedir}/testsrc" />