我正在尝试使用 Ant 构建脚本版本 1.10.12 和 junitlauncher 任务来运行我的单元测试。此时我已经对所有内容进行了三到四次验证,甚至在 github 上查看了此任务的源代码 [https://ant.apache.org/manual/Tasks/junitlauncher.html][1]。
错误是
无法启动虚拟机内测试
堆栈跟踪是
在 org.apache.tools.ant.taskdefs.可选.junitlauncher.confined.JUnitLauncherTask.launchViaReflection(JUnitLauncherTask.java:223) 在 org.apache.tools.ant.taskdefs.可选.junitlauncher.confined.JUnitLauncherTask.execute(JUnitLauncherTask.java:105) 在 org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:299) 在 sun.reflect.GenerateMethodAccessor7.invoke(来源未知) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 处 org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99) 在 org.apache.tools.ant.Task.perform(Task.java:350) 处 org.apache.tools.ant.Target.execute(Target.java:449) 在 org.apache.tools.ant.Target.performTasks(Target.java:470) 在 org.apache.tools.ant.Project.executeSortedTargets(Project.java:1401) 在 org.apache.tools.ant.Project.executeTarget(Project.java:1374) 处 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 在 org.apache.tools.ant.Project.executeTargets(Project.java:1264) 处 org.apache.tools.ant.Main.runBuild(Main.java:818) 在 org.apache.tools.ant.Main.startAnt(Main.java:223) 在 org.apache.tools.ant.Main.start(Main.java:190) 在 org.apache.tools.ant.Main.main(Main.java:274) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 处 com.intellij.rt.ant.execution.AntMain2.main(AntMain2.java:31) 引起 通过:java.lang.reflect.InitationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 处 org.apache.tools.ant.taskdefs.可选.junitlauncher.confined.JUnitLauncherTask.launchViaReflection(JUnitLauncherTask.java:221)
查看源代码中发生错误的方法没有帮助,并且根据我所做的研究,错误消息的含义较少且完全没有记录。
我脚本中的目标
<target name="unittest" description="Run units tests">
<junitlauncher haltOnFailure="false" printSummary="true">
<classpath refid="junit.class.path"/>
<classpath refid="mcwr.runtime.module.classpath"/>
<testclasses outputdir="testreports">
<fileset dir="${mcwr.testoutput.dir}">
</fileset>
<listener type="legacy-brief" sendSysOut="true"/>
<listener type="legacy-xml" sendSysErr="true" sendSysOut="true"/>
</testclasses>
</junitlauncher>
</target>
此时我完全陷入困境。这个错误是什么意思以及如何解决它?
这里是源代码(方法是“launchViaReflection”https://github.com/apache/ant/blob/master/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/confined/ JUnitLauncherTask.java
我遇到了这个问题,最后解决了。 您可能会在堆栈跟踪中进一步收到有关 XML 侦听器的错误?
定义的目录<testclasses outputdir="DIRECTORY">
必须提前存在。 您可以添加类似的内容
<mkdir dir="DIRECTORY"/>
到“单元测试”目标的顶部。
另一件事是“DIRECTORY”值似乎需要测试类的绝对路径,所以虽然
<mkdir dir="testreports"/>
可以在 basedir 上创建你的目录就好了,
<testclasses outputDir="testreports">
会导致错误。
您可以使用“位置”而不是“值”来创建属性
<property name="testreports" location="testreports" />
<testclasses outputDir="${testreports}">
或者使用basedir属性给出绝对路径
<testclasses outputDir="${basedir}/testreports">
我也遇到过类似的情况。 希望它会对某人有所帮助,就我而言,我运行了
ant -v
并获得了一个输出,指出 Caused by: java.lang.ClassNotFoundException: jdk.jfr.Event
。 只需删除 junit-platform-jfr-<version>.jar
就可以解决问题,并使构建(和测试)过程正常工作。