我有这个签名的方法:
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>
答案 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`.