Junit内联比较器初始化错误

时间:2009-07-20 13:52:27

标签: java hudson junit4 comparator

我创建了一个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{}

任何想法将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:2)

问题在于Hudson将strcmp看作是它试图运行的测试类。这是一个内部类的事实并没有改变这一点。需要更改Hudson配置以将此类排除为测试类。

如果你不能这样做,那么使用公共noargs构造函数使strcmp成为一个公共静态类,并为它添加一个不执行任何操作的测试方法(或者类上的ignore标记可能有效)。但是,如果你能让测试运动员根本不把这个班级作为一个考试班,那就更好了。

答案 1 :(得分:0)

  

java.lang.Exception:测试类应该在

处具有公共零参数构造函数

那么,你的@Test类有一个公共的零参数构造函数吗?无法判断您发布的内容是否属实。

您可能还希望正确地为内部类提供可访问性修饰符(publicprotected等)以及正确命名(类应以大写字母开头)。如果这些类是通过反射调用的,那么JUnit运行器总是可以对格式化和命名规则做出某些假设......