在JUnit中的Test类中定义内部类时出错

时间:2010-11-11 00:40:37

标签: java reflection junit inner-classes junit3

我在从TestCase继承的Test类中为JUnit 3定义内部类时遇到一些问题。场景如下:

Foo.java

public class Foo {
  public void method() { ... }
}

FooTest.java

public class FooTest extends TestCase {
  public class Bar extends Foo {
    public void method() { ... }
  }
  public void testMethod() { ... }
}

现在,如果我从Eclipse运行它,测试运行正常,但如果我尝试从Ant任务运行它会失败:

[junit] junit.framework.AssertionFailedError:类Foo $ Bar没有公共构造函数TestCase(String name)或TestCase()

Bar不是Test类,它只是Foo的一个子类,它覆盖了一些方法,在测试时我不需要做真正的事情。

我现在很迷茫,我不知道如何解决这个问题。是唯一的创建子类的方法吗?

4 个答案:

答案 0 :(得分:16)

这是因为你在junit文件集中包含了一个嵌套类。 在build.xml中添加“excludes”属性。

例如:

<target name="test" depends="test-compile">
    <junit>
        <batchtest todir="${test.build.dir}" unless="testcase">
            <fileset dir="${test.build.classes}"
                includes = "**/Test*.class"
                excludes = "**/*$*.class"/>
        </batchtest>
    </junit>
</target>  

答案 1 :(得分:5)

您可以尝试将Bar类定义为static:

public class FooTest extends TestCase {
  public static class Bar extends Foo {
    public void method() { ... }
  }
  public void testMethod() { ... }
}

...但它在一个环境中工作但在另一个环境中不工作这一事实暗示了两件事之一:

  1. Java版
  2. 类路径
  3. [编辑:按照Jim的建议]不同版本的junit.jar

答案 2 :(得分:4)

我感觉自己像个凶手,但问题是我今天遇到了与maven类似的问题。

通常mvn test运行良好,但是当我想要从mvn test -Dtest=com.test.* - initializationError等特定包中运行测试时。这对Junit 3和4都有效。

我找到了我的maven-case的原因,这对于ant来说可能是相同的。 问题是:默认情况下,maven的测试插件(确定的是)只将所有类的特定子集视为“测试类”,即按名称搜索它们,如* Test等等(您可以在{{3处阅读此内容)当我们定义test属性时,我们完全覆盖默认行为。这意味着,只有-Dtest=com.test.*,才能获得com.test.MyTestClass以及com.test.MyTestClass.InnerClass甚至com.test.MyTestClass$1(即匿名类)。

所以为了运行,例如某些包中的类应该使用-Dtest=com.test.*Test之类的东西(如果你使用后缀来识别测试类的话)。

答案 3 :(得分:3)

如果您不想排除所有内部类,也可以注释嵌套类@Ignore。