Java CruiseControl JUnit测试结果显示全部为零

Java CruiseControl JUnit测试结果显示全部为零,java,junit,cruisecontrol,Java,Junit,Cruisecontrol,我已经将JUnit与CruiseControl连接起来,并且正在执行单元测试和导入日志,但是CruiseControl显示以下输出: nz.co.picksend.core.tests.nz.co.picksend.core.dal.FilterTests Tests: 0, Failures: 0, Errors: 0, Duration: 0.0 nz.co.picksend.core.tests.nz.co.picksend.core.dal.ModelObjectRegistryTes

我已经将JUnit与CruiseControl连接起来,并且正在执行单元测试和导入日志,但是CruiseControl显示以下输出:

nz.co.picksend.core.tests.nz.co.picksend.core.dal.FilterTests 
Tests: 0, Failures: 0, Errors: 0, Duration: 0.0
nz.co.picksend.core.tests.nz.co.picksend.core.dal.ModelObjectRegistryTests 
Tests: 0, Failures: 0, Errors: 0, Duration: 0.0
nz.co.picksend.core.tests.nz.co.picksend.core.dal.ModelObjectSetTests 
Tests: 0, Failures: 0, Errors: 0, Duration: 0.0
nz.co.picksend.core.tests.nz.co.picksend.core.humanresources.AllHumanResourcesTests 
Tests: 0, Failures: 0, Errors: 0, Duration: 0.0
(注意全部为零)

但是,正在合并的日志文件如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<testsuite errors="1" failures="0" hostname="maudslay"
    name="nz.co.picksend.core.tests.nz.co.picksend.core.rules.MockEvalRule" tests="1"
    time="0.0" timestamp="2009-11-04T23:05:19">
<properties>
    ...
</properties>
<error message="nz.co.picksend.core.tests.nz.co.picksend.core.rules.MockEvalRule"
    type="java.lang.ClassNotFoundException">
java.lang.ClassNotFoundException:
    nz.co.picksend.core.tests.nz.co.picksend.core.rules.MockEvalRule
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
</error>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>

...
java.lang.ClassNotFoundException:
nz.co.picksend.core.tests.nz.co.picksend.core.rules.MockEvalRule
在java.net.URLClassLoader$1.run(URLClassLoader.java:200)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:188)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:307)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:252)
位于java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:169)
以下是ant的build.xml中的代码片段:

<target name="test">
    <junit errorProperty="test.failed" failureProperty="test.failed">
    <formatter type="brief" usefile="false" />
        <formatter type="xml" />
        <batchtest todir="${buildresults.dir}">
            <fileset dir="${basedir}">
                <include name="nz.co*/**/tests/**/*.java" />
                <include name="nz.co*/**/test/**/*.java" />
            </fileset>
        </batchtest>
    </junit>
<fail message="Tests failed: check test reports." if="test.failed" />
</target>

最后,这里是cruisecontrol的config.xml中的项目片段:

<project requiremodification="false" name="Pick and Send">
    <modificationset QuietPeriod="30">
        ....
    </modificationset>
    <schedule Interval="300" ShowProgress="true">
        <ant AntWorkingDir="E:\Build\PickSend2" 
        BuildFile="E:\Build\PickSend2\build.xml" 
        Time="0400" Target="bat" anthome="apache-ant-1.7.0" />
    </schedule>
    <log>
        <merge Dir="E:\Build\PickSend2\buildresults" />
    </log>
    <bootstrappers>
        ....
    </bootstrappers>
</project>

....
....

以前有人遇到过这种情况吗?

发生这种情况是因为单元测试抛出错误,不是在测试本身,而是在测试设置中。由于某些原因,cruisecontrol没有捕捉到这一点

您的输出包含如下包:“nz.co.picksend.core.tests.nz.co.picksend.core.rules”。我注意到“nz.co.picksend.core”在包名中出现了两次。我不知道这是不是有意的?可能是问题。谢谢你的评论-这实际上是有意的。nz.co.picksend.core是项目和包的基本名称,因此源代码树看起来像/nz.co.picksend.core/tests/nz/co/picksend/core/…这也可能是问题的一部分!您的源代码树是“/nz.co.picksend.core/tests/nz/co/picksend/core/”;Junit正在寻找“nz.co.picksend.core.tests.nz.co.picksend.core.rules.MockEvalRule”;它希望在“nz/co/picksend/core/tests/nz/co/picksend/core/rules/MockEvalRule.class”中找到它(只需将“.”s替换为“/”s)。我会考虑重构包名来排除“.s”,看看这是怎么回事。我想你是对的。只是为了支持前面的陈述。我怀疑你能否在包裹名称中使用点(句号)。JLS()定义了可以用作Java标识符一部分的字符。一个点不是其中之一。您可以通过运行
Character.isJavaIdentifierPart('.')
来检查它。