TDD会话期间的java.lang.AssertionError

时间:2017-09-14 16:22:53

标签: java arrays unit-testing junit char

我有这个签名的方法:

public char[] checkDouble(String s) { 
    int[] letters = new int[26]; 
    for (int i = 0; i < s.length(); i++) { 
        letters[s.charAt(i) - 97]++; 
    } 
    char[] copyLoop = new char[26]; 
    for (int i = 0; i < letters.length; i++) { 
        if (letters[i] > 1) { 
            char c = (char) (i + 97); 
            copyLoop[i] = c; 
        } 
    } 
    return copyLoop; 
}

和我的Junit测试用例:

public class DoubleCharTest {

private DoubleChar c;

@Before
public void before() {
    c = new DoubleChar();
}

@Test
public void test1(){
    char [] result = c.checkDouble("wallaby");
    Assert.assertEquals("al", result);

}

为什么我的测试没有通过,我有这个错误?

expected: 'al' but was:<[C@3d075dc0>

1 个答案:

答案 0 :(得分:2)

您正在比较String:&#34; al&#34;使用char[]

在调用result之前,您必须将String转换为assertEquals

例如:

Assert.assertEquals("al", String.valueOf(result));

或者您可以将它们作为数组进行比较:

Assert.assertArrayEquals("al".toCharArray(), result);

更新1:为了回应下面的评论,问题不再出现在断言中,问题出在checkDouble()方法中。您正在为char[26]分配copyLoop,然后遍历给定的字符串,并为每个重复的字母将char设置到该数组中。然后返回该数组。所以,当你传入&#34;小袋鼠&#34;结果copyLoop包含&#34; a&#34;,&#34; l&#34; copyLoop中的每个其他元素都是默认的char值:'\u0000'。这会导致断言失败,但是当您打印结果时,这些默认的char值对您来说是不可见的,因此您会被欺骗认为结果只包含&#34; al&#34;而实际上它包含:

`a,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,l,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000,\u0000`.