实际和预期相同,但测试失败

时间:2020-02-04 03:36:08

标签: java junit4

我正在尝试学习Junit4并为我的一些代码做测试。基本上,我将字符串反转,并将特殊符号保留在适当的位置。在测试过程中,我发现我无法理解的失败。 尽管实际值和预期值相同,但我的单元测试失败。 预先谢谢你!

错误:

org.junit.ComparisonFailure:
预期:d1cba hgf!e
实际:d1cba hgf!e

代码

public final class AnagramsMaker {
    public static String reverseWord(String stringToReverse) {
        char[] stringToChar = stringToReverse.toCharArray();
        int arrayStart = 0;
        int arrayEnd = stringToChar.length - 1;

        while (arrayStart < arrayEnd) {
            if (Character.isLetter(stringToChar[arrayStart]) && Character.isLetter(stringToChar[arrayEnd])) {
                char temp = stringToChar[arrayStart];
                stringToChar[arrayStart] = stringToChar[arrayEnd];
                stringToChar[arrayEnd] = temp;

                arrayStart++;
                arrayEnd--;
            }
            else if (Character.isLetter(stringToChar[arrayStart]) && !Character.isLetter(stringToChar[arrayEnd])) {
                arrayEnd--;
            }
            else if (!Character.isLetter(stringToChar[arrayStart]) && Character.isLetter(stringToChar[arrayEnd])) {
                arrayStart++;
            }
            else {
                arrayStart++;
                arrayEnd--;
            }
        }

        return String.valueOf(stringToChar);
    }

    public static String createAnagram(String inputString) {
        String anagram = "";
        String [] arr = inputString.split(" ");

        for (String s : arr) {
            anagram += reverseWord(s) + " ";
        }
        return anagram;
        } 
   }

Junit:

 @Test
    public void createAnagram() {
        assertEquals("d1cba hgf!e", AnagramsMaker.createAnagram("a1bcd efg!h"));
    }

1 个答案:

答案 0 :(得分:3)

我尝试复制它,并得到了:expected: <d1cba hgf!e> but was: <d1cba hgf!e >。请注意最后的多余空间。

createAnagram方法中存在错误。您将在每个字符串之后添加额外的空间,但是对于最后一次迭代,多余的空间会被添加到导致此问题的末尾。

作为解决方法,请在返回值之前先修整值,如下所示

public static String createAnagram(String inputString) {
        String anagram = "";
        String [] arr = inputString.split(" ");

        for (String s : arr) {
            anagram += reverseWord(s) + " ";
        }
        return anagram.trim();
    }

如果您对Java8和流感到满意,更好的方法是使用Collectors.joining方法,如下所示

public static String createAnagram(String inputString) {
        String[] arr = inputString.split(" ");
        return Stream.of(arr)
                .map(AnagramsMaker::reverseWord)
                .collect(Collectors.joining(" "));
    }