我创建了一个SortedList类,它有一个构造函数,它将java.util.Comparator作为参数。
在我的机器上运行单元测试后(通过eclipse 3.3.0),一切正常。然而,Hudson抱怨是因为它说它无法实例化我的比较器。
这是我的简单测试(片段)
public class SortedListTest {
class strcmp implements Comparator<String>{
public strcmp(){}
public int compare(String s1,String s2){
return s1.compareTo(s2);
}
}
@Test
public void testAdd(){
SortedList<String> list = new SortedList<String>(new strcmp());
}
}
或另一种方式:
public void testAdd(){
SortedList<String> list = new SortedList<String>(new Comparator<String>(){
public int compare(String s1,String s2){
return s1.compareTo(s2);
}
});
}
Hudson显示的错误是
ar.com.lib.SortedListTest $ strcmp.initializationError0
错误消息
测试类应具有公共零参数构造函数
堆栈跟踪
java.lang.Exception:测试类应该 有公共零参数构造函数 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 引起: java.lang.NoSuchMethodException: ar.com.lib.SortedListTest $的strcmp()。 在 java.lang.Class.getConstructor0(Class.java:2706) 在 java.lang.Class.getConstructor(Class.java:1657)
我试过使用@Ignore注释,但到目前为止没有运气。当我尝试
时它不会编译@Ignore class strcmp{}
任何想法将不胜感激。提前谢谢。
答案 0 :(得分:2)
问题在于Hudson将strcmp看作是它试图运行的测试类。这是一个内部类的事实并没有改变这一点。需要更改Hudson配置以将此类排除为测试类。
如果你不能这样做,那么使用公共noargs构造函数使strcmp成为一个公共静态类,并为它添加一个不执行任何操作的测试方法(或者类上的ignore标记可能有效)。但是,如果你能让测试运动员根本不把这个班级作为一个考试班,那就更好了。
答案 1 :(得分:0)
java.lang.Exception:测试类应该在
处具有公共零参数构造函数
那么,你的@Test
类有一个公共的零参数构造函数吗?无法判断您发布的内容是否属实。
您可能还希望正确地为内部类提供可访问性修饰符(public
,protected
等)以及正确命名(类应以大写字母开头)。如果这些类是通过反射调用的,那么JUnit运行器总是可以对格式化和命名规则做出某些假设......