【问题标题】:java.lang.AssertionError during TDD sessionTDD 会话期间的 java.lang.AssertionError
【发布时间】:2017-09-14 16:22:52
【问题描述】:

我有这个签名的方法:

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>

【问题讨论】:

    标签: java arrays unit-testing junit char


    【解决方案1】:

    您将String: "al" 与char[] 进行比较。

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

    例如:

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

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

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

    更新 1: 针对下面的 cmets,问题不再在断言中,问题在 checkDouble() 方法中。您将char[26] 分配给copyLoop,然后遍历给定的字符串并为每个重复的字母在该数组中设置一个字符。然后返回该数组。因此,当您传入“wallaby”时,生成的copyLoop 包含“a”、“l”,copyLoop 中的所有其他元素都是默认字符值:'\u0000'。这会导致断言失败,但是当您打印结果时这些默认 char 值对您不可见,因此您被欺骗认为结果仅包含“al”,而实际上它包含:

    `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`. 
    

    【讨论】:

    • public void test1(){ char [] result = c.checkDouble("casa"); Assert.assertEquals("a", String.valueOf(result));很抱歉,但它不起作用。再次:预期: 但是:。我很困惑!
    • @Clash 您能否更新您的问题以包括checkDouble() 的实现?
    • public char[] checkDouble(String s) { int[] letters = new int[26]; for (int i = 0; i &lt; s.length(); i++) { letters[s.charAt(i) - 97]++; } char[] copyLoop = new char[26]; for (int i = 0; i &lt; letters.length; i++) { if (letters[i] &gt; 1) { char c = (char) (i + 97); copyLoop[i] = c; } } return copyLoop; }
    • 我已将该实现添加到您的问题中。我认为这里的问题在于该实现 not 与断言。我的回答中的两种断言方法都是有效的。我认为您的测试仍然失败的原因是 checkDouble() 没有返回您的测试期望它返回的答案。
    • 你能在你的环境中尝试一个完整的测试,代码和junit测试吗?如果你把 System.out.println 它给我们正确的结果。很奇怪
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2021-09-02
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多