Java 测试列表<;字节[]>;为了平等

Java 测试列表<;字节[]>;为了平等,java,testing,testng,Java,Testing,Testng,我使用TestNG进行单元测试,现在我有了一个方法来测试返回列表的方法。下面是我的测试现在的样子: public List<byte[]> methodToTest(){ //... } @Test public void test(){ List<byte[]> expected; //... Assert.assertEquals(methodToTest(), expected); //now fails } 公共列表方法测试(){

我使用TestNG进行单元测试,现在我有了一个方法来测试返回
列表的方法。下面是我的测试现在的样子:

public List<byte[]> methodToTest(){
   //...
}

@Test
public void test(){
    List<byte[]> expected;
    //...
    Assert.assertEquals(methodToTest(), expected); //now fails
}
公共列表方法测试(){
//...
}
@试验
公开无效测试(){
预期名单;
//...
Assert.assertEquals(methodToTest(),应为);//现在失败
}
问题是,是否可以让TestNG不仅使用
equals
,而且使用
数组.equals
执行
列表
内容比较(
字节[]

或者我必须遍历
列表
,并自己对每个元素进行比较?

用法 将以下代码复制到测试中:

Matcher<List<?>> deepEqual(List<?> expected) {
    return new FeatureMatcher<List<?>, List<?>>(equalTo(arrayToList(expected))
                                               ,"items", "") {
        @Override
        protected List<?> featureValueOf(List<?> actual) {
            return arrayToList(actual);
        }
    };
}

static List<?> arrayToList(List<?> it) {
    List<Object> result = new ArrayList<>();
    for (Object item : it) {
        result.add(isArray(item) ? Arrays.asList(array(item)) : item);
    }
    return result;
}

static boolean isArray(Object it) {
    return it != null && it.getClass().isArray();
}

static Object[] array(Object array) {
    int length = Array.getLength(array);
    Object[] result = new Object[length];
    for (int i = 0; i < length; i++) {
        result[i] = Array.get(array, i);
    }
    return result;
}
匹配器,列表>(相等(数组列表(预期))
,“项目”和“”){
@凌驾
受保护列表功能值(列表实际值){
返回数组列表(实际);
}
};
}
静态列表arrayToList(列出它){
列表结果=新建ArrayList();
用于(对象项:it){
结果.add(isArray(item)?Arrays.asList(array(item)):item);
}
返回结果;
}
静态布尔isArray(对象it){
返回它!=null&&it.getClass().isArray();
}
静态对象[]数组(对象数组){
int length=Array.getLength(数组);
对象[]结果=新对象[长度];
for(int i=0;i
注意:您需要将库添加到测试类路径中。

用法 将以下代码复制到测试中:

Matcher<List<?>> deepEqual(List<?> expected) {
    return new FeatureMatcher<List<?>, List<?>>(equalTo(arrayToList(expected))
                                               ,"items", "") {
        @Override
        protected List<?> featureValueOf(List<?> actual) {
            return arrayToList(actual);
        }
    };
}

static List<?> arrayToList(List<?> it) {
    List<Object> result = new ArrayList<>();
    for (Object item : it) {
        result.add(isArray(item) ? Arrays.asList(array(item)) : item);
    }
    return result;
}

static boolean isArray(Object it) {
    return it != null && it.getClass().isArray();
}

static Object[] array(Object array) {
    int length = Array.getLength(array);
    Object[] result = new Object[length];
    for (int i = 0; i < length; i++) {
        result[i] = Array.get(array, i);
    }
    return result;
}
匹配器,列表>(相等(数组列表(预期))
,“项目”和“”){
@凌驾
受保护列表功能值(列表实际值){
返回数组列表(实际);
}
};
}
静态列表arrayToList(列出它){
列表结果=新建ArrayList();
用于(对象项:it){
结果.add(isArray(item)?Arrays.asList(array(item)):item);
}
返回结果;
}
静态布尔isArray(对象it){
返回它!=null&&it.getClass().isArray();
}
静态对象[]数组(对象数组){
int length=Array.getLength(数组);
对象[]结果=新对象[长度];
for(int i=0;i

注意:您需要将库添加到测试类路径中。

断言如下:


Assert.assertTrue(Arrays.equals(byteArray1,byteArray2))

断言将如下所示:


Assert.assertTrue(Arrays.equals(byteArray1,byteArray2))

TestNG已经提供了一些深度断言,但是缺少具有List参数的断言:

TestNG已经提供了一些深度断言,但是缺少具有List参数的断言:

字节[]上调用
equals
将与使用
==
相同,并且大部分会失败。您需要为返回列表中的每个元素调用
Arrays.equals(byteArray1,byteArray2)
。我认为您需要使用循环来实现此目的。@反斜杠是的,这就是为什么我要问如何与
数组进行比较。equals
,而不仅仅是
equals
,您需要调用列表中的每个元素。@反斜杠悲伤。。。例如,在ScalaTest中,我们可以为测试提供定制的“比较器”…您可以做的事情是编写定制断言。我认为您可以很容易地重写所需的方法,以使其进行数组比较。在
字节[]上调用
equals
将与使用
=
相同,并且大部分会失败。您需要为返回列表中的每个元素调用
Arrays.equals(byteArray1,byteArray2)
。我认为您需要使用循环来实现此目的。@反斜杠是的,这就是为什么我要问如何与
数组进行比较。equals
,而不仅仅是
equals
,您需要调用列表中的每个元素。@反斜杠悲伤。。。例如,在ScalaTest中,我们可以为测试提供定制的“比较器”…您可以做的事情是编写定制断言。我认为你可以很容易地重写你需要的方法,让它也做数组比较