[英]Error when defining inner classes in a Test class in JUnit
我在从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的一个子类,它覆盖了一些方法,在测试时我不需要做真正的事情。
我现在很迷茫,我不知道如何解决这个问题。 是独立创建子类的唯一方法吗?
这是因为您在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>
您可以尝试将Bar类定义为static:
public class FooTest extends TestCase {
public static class Bar extends Foo {
public void method() { ... }
}
public void testMethod() { ... }
}
...但它在一个环境中工作而在另一个环境中工作的事实暗示了两件事之一:
我觉得自己像个傻瓜,但问题是我今天遇到了与maven类似的问题。
通常的mvn test
运行良好,但是当我想从特定的包运行测试时,例如mvn test -Dtest=com.test.*
- 抛出了initializationError
。 这对于Junit 3和4都“有效”。
我找到了我的maven-case的原因,这对于ant来说可能是一样的。 问题是:默认情况下,maven的测试插件(确定是的)只将所有类的特定子集视为“测试类”,即按名称搜索它们,如* Test等(您可以在surefire的主页上阅读此内容)当我们定义test
属性时,我们完全覆盖默认行为。 这意味着使用-Dtest=com.test.*
不仅会获取com.test.MyTestClass
,还会获得com.test.MyTestClass.InnerClass
甚至com.test.MyTestClass$1
(即匿名类)。
因此,为了运行某些包中的类,您应该使用类似-Dtest=com.test.*Test
(如果您使用后缀来识别测试类)。
如果您不想排除所有内部类,也可以注释嵌套类@Ignore。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.