字符串缓冲区单元测试失败

时间:2017-04-20 11:30:16

标签: java

我正在尝试创建一个菱形并返回转换为字符串的stringbuffer。在控制台中,我看到了我所期待的。但是我的单元测试失败了。请详细说明我的测试失败的原因。

public class Diamond {
    public static String print(int n) {
        if (n <= 0)
            return null;

        StringBuffer buffer = new StringBuffer();
        int mid = (n + 1) / 2;
        int midIdx = mid - 1;
        int run = 1;
        while (run <= n) {
            char[] chars = new char[n];
            int delta = Math.abs(mid - run);
            for (int idx = 0; idx < mid - delta; idx++) {
                chars[midIdx - idx] = '*';
                chars[midIdx + idx] = '*';
            }

            buffer.append(rightTrim(new String(chars)) + "\n");
            run++;
        }

        return buffer.toString();
    }

    public static String rightTrim(String s) {
        int i = s.length() - 1;
        while (i >= 0 && s.charAt(i) != '*') {
            i--;
        }
        return s.substring(0, i + 1);
    }

    // public static void main(String... strings) {
    // System.out.println(print(3));
    // }
}

单元测试     import static org.junit.Assert.assertEquals;     import static org.junit.Assert.assertNull;

import org.junit.Test;

public class DiamondTest {
    @Test
    public void testDiamond3() {
        StringBuffer expected = new StringBuffer();
        expected.append(" *\n");
        expected.append("***\n");
        expected.append(" *\n");

        assertEquals(expected.toString(), Diamond.print(3));
    }

    @Test
    public void testDiamond5() {
        StringBuffer expected = new StringBuffer();
        expected.append("  *\n");
        expected.append(" ***\n");
        expected.append("*****\n");
        expected.append(" ***\n");
        expected.append("  *\n");

        assertEquals(expected.toString(), Diamond.print(5));
    }

    @Test
    public void getNullReturned() {
        assertNull(Diamond.print(0));
    }
}

2 个答案:

答案 0 :(得分:1)

chars数组未初始化(char[] chars = new char[n];)。 因此,非*字符与空格(' ')不同,即数组包含空字节。初始化数组有助于,例如使用Arrays.fill(chars, ' ')

答案 1 :(得分:1)

问题出在这里。

char[] chars = new char[n];

您正在从字符数组中初始化一个字符串,默认情况下该字符数组满了\u0000(零值)。

然而在测试中,您正在与空格字符(ascii值32)进行比较。

所以你需要用空格来初始化字符串。这是一种方法:

char[] chars = new char[n];
Arrays.fill(chars, ' ');