我正在尝试创建一个菱形并返回转换为字符串的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));
}
}
答案 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, ' ');