10

在从 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: Class Foo$Bar has no public constructor TestCase(String name) or TestCase()

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

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

4

4 回答 4

18

这是因为您在 junit 文件集中包含了一个嵌套类。将“排除”属性添加到您的 build.xml。

例如:

<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>  
于 2012-03-22T09:52:44.333 回答
5

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

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

...但是它在一种环境中起作用但在另一种环境中不起作用的事实表明了以下两件事之一:

  1. 爪哇版
  2. 类路径
  3. [编辑:如下 Jim 所建议的] 不同版本的 junit.jar
于 2010-11-11T03:23:17.780 回答
4

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

通常mvn test运行良好,但是当我想从特定包运行测试时,例如mvn test -Dtest=com.test.*-initializationError被抛出。这适用于 Junit 3 和 4。

我找到了我的 maven-case 的原因,这可能与 ant 相同。问题是:默认情况下,maven 的测试插件(即surefire)仅将所有类的特定子集视为“测试类”,即按名称搜索它们,例如 *Test 等(您可以在surefire的主页上阅读有关此内容的信息) ). 当我们定义test属性时,我们完全覆盖默认行为。这意味着使用-Dtest=com.test.*surefire 不仅会拾取com.test.MyTestClass而且com.test.MyTestClass.InnerClass甚至会拾取com.test.MyTestClass$1(即匿名类)。

因此,为了从某个包中运行例如类,您应该使用类似的东西-Dtest=com.test.*Test(当然,如果您使用后缀来识别测试类)。

于 2011-03-25T14:32:11.507 回答
4

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

于 2012-07-29T11:58:34.650 回答