2016-03-30 178 views
0

我有以下Ant目標:螞蟻junit任務失敗運行測試之前

<path id="test-classpath"> 
    <fileset dir="lib"> 
     <include name="*.jar" /> 
    </fileset> 
    <pathelement path="bin/release" /> 
</path> 

<target name="run-test"> 
    <junit printsummary="yes" haltonfailure="yes" fork="true"> 
     <formatter type="failure"/> 
     <test name="someNamespace.someTest" /> 
     <classpath refid="test-classpath" /> 
    </junit> 
</target> 

當我嘗試從命令行運行它,我得到以下輸出:

>ant run-test 
Buildfile: ...\build.xml 
    [echo] 2016-03-30 20:29:29 

run-test: 
    [junit] Exception in thread "main" java.lang.reflect.InvocationTargetException 
    [junit]  at org.apache.tools.ant.taskdefs.optional.junit.FormatterElement.createFormatter(FormatterElement.java:343) 
    [junit]  at org.apache.tools.ant.taskdefs.optional.junit.FormatterElement.createFormatter(FormatterElement.java:257) 
    [junit]  at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.transferFormatters(JUnitTestRunner.java:1085) 
    [junit]  at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1180) 
    [junit]  at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1033) 
    [junit] Caused by: java.lang.reflect.InvocationTargetException 
    [junit]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    [junit]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    [junit]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    [junit]  at java.lang.reflect.Method.invoke(Method.java:498) 
    [junit]  at org.apache.tools.ant.taskdefs.optional.junit.FormatterElement.createFormatter(FormatterElement.java:337) 
    [junit]  ... 4 more 
    [junit] Caused by: java.lang.NullPointerException 
    [junit]  at org.apache.tools.ant.taskdefs.optional.junit.FailureRecorder.setProject(FailureRecorder.java:153) 
    [junit]  ... 9 more 

BUILD FAILED 
...\build.xml:171: Using loader AntClassLoader[ 
    C:\Program Files (x86)\apache-ant-1.9.6\lib\ant-launcher.jar; 
    C:\Program Files (x86)\apache-ant-1.9.6\lib\ant.jar; 
    C:\Program Files (x86)\apache-ant-1.9.6\lib\ant-junit.jar; 
    C:\Program Files (x86)\apache-ant-1.9.6\lib\ant-junit4.jar; 
    ...\lib\commons-math3-3.5.jar; 
    ...\lib\hamcrest-core-1.3.jar; 
    ...\lib\junit-4.11.jar; 
    ...\lib\log4j-api-2.5.jar; 
    ...\lib\log4j-core-2.5.jar; 
    ...\bin\release] on class org.apache.tools.ant.taskdefs.optional.junit.FailureRecorder: 
java.lang.NoClassDefFoundError: junit/framework/TestListener 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
     at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at org.apache.tools.ant.AntClassLoader.findBaseClass(AntClassLoader.java:1407) 
     at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1085) 
     at org.apache.tools.ant.util.SplitClassLoader.loadClass(SplitClassLoader.java:58) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:348) 
     at org.apache.tools.ant.taskdefs.optional.junit.FormatterElement.createFormatter(FormatterElement.java:287) 
     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.logVmExit(JUnitTask.java:1854) 
     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.logVmCrash(JUnitTask.java:1818) 
     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeAsForked(JUnitTask.java:1295) 
     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:1024) 
     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeOrQueue(JUnitTask.java:2105) 
     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:832) 
     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293) 
     at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
     at org.apache.tools.ant.Task.perform(Task.java:348) 
     at org.apache.tools.ant.Target.execute(Target.java:435) 
     at org.apache.tools.ant.Target.performTasks(Target.java:456) 
     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405) 
     at org.apache.tools.ant.Project.executeTarget(Project.java:1376) 
     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
     at org.apache.tools.ant.Project.executeTargets(Project.java:1260) 
     at org.apache.tools.ant.Main.runBuild(Main.java:853) 
     at org.apache.tools.ant.Main.startAnt(Main.java:235) 
     at org.apache.tools.ant.launch.Launcher.run(Launcher.java:285) 
     at org.apache.tools.ant.launch.Launcher.main(Launcher.java:112) 
Caused by: java.lang.ClassNotFoundException: junit.framework.TestListener 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 51 more 

Total time: 3 seconds 

測試在Eclipse Mars(4.5.2)中成功運行。有誰知道爲什麼會發生這種情況,以及如何讓我的JUnit測試通過ant運行?我使用JUnit 4.11,並嘗試過ant v1.9.3和v1.9.6(上面的輸出是從ant v1.9.6生成的)。

編輯

我用螞蟻v1.8.4,每註釋中的建議也測試過,但沒有(比jar文件的版本號等)上所產生的碰撞產生任何影響。

+0

可能重複[類未找到Ant,常春藤和JUnit - 錯誤build.xml?](http://stackoverflow.com/questions/15979391/class-not-found-with-ant-ivy-and -junit-error-in-build-xml) – kryger

+0

@kryger我認爲這個問題的答案是你鏈接到的問題的評論,所以我不認爲它是重複的類。 – zode64

+0

@kryger由於兩個原因,該問題沒有回答我的問題。首先,問題表明OP打開了一個[ant bug](https://bz.apache.org/bugzilla/show_bug.cgi?id=54835),但該bug在ant 1.9.6中被關閉。我在該版本中進行了測試,問題依然存在。其次,即使我嘗試使用ant 1.8.4,也會產生完全相同的堆棧跟蹤(jar文件中的不同版本號)。 –

回答

0

我終於明白了問題所在。我的JUnit任務類路徑不正確,因爲我忘記了包含我的測試套件類的位置。一旦我糾正了類路徑,一切都按預期工作。不過,我認爲這是一個應由Ant或JUnit團隊解決的缺陷。諸如「XXX級無法加載」之類的消息會更有幫助。