如何在简单算法上应用单元测试?

时间:2019-05-27 13:49:34

标签: java unit-testing junit

我有一个绘制圣诞树的maven项目。我需要对其进行单元测试,但我不知道该怎么做:/

我已经在Maven项目中设置了JUnit

for (int i = 0; i < 4; i++) {
   for (int j = 0; j < 10 - i; j++)
    System.out.print(" ");
   for (int k = 0; k < (2 * i + 1); k++)
    System.out.print("*");
   System.out.println();
  }

2 个答案:

答案 0 :(得分:1)

假设您的班级绘制圣诞树看起来像这样:

class ChristmasTreeDrafter {

    void draw() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 10 - i; j++)
                System.out.print(" ");
            for (int k = 0; k < (2 * i + 1); k++)
                System.out.print("*");
            System.out.println();
        }
    }
}

您可以通过这种方式对其进行测试:

public class ChristmasTreeDrafterTest {

    private final ByteArrayOutputStream out = new ByteArrayOutputStream();

    @Before
    public void setup() {
        System.setOut(new PrintStream(out));
    }

    @Test
    public void shouldDrawChristmasTree() {
        // given
        ChristmasTreeDrafter christmasTreeDrafter = new ChristmasTreeDrafter();

        // when
        christmasTreeDrafter.draw();

        // then
        Assert.assertEquals("          *\r\n" +
                "         ***\r\n" +
                "        *****\r\n" +
                "       *******\r\n", out.toString());
    }
}

setup方法中,标准输出流被重定向到out对象,因此,您可以在then块中验证其内容。不幸的是,Java没有多行字符串,因此这段代码很难看。为了提高可读性,您可以将此内容提取到test/resources下的文件中(假定使用默认的maven项目结构)。

答案 1 :(得分:0)

从高层次上讲:该代码的目的是打印由星号制成的树或三角形。测试很简单,运行代码,看看它会生成所需的输出。

由于代码正在打印到System.out,因此您需要将System.out重定向到文件或字符串(请参见this),然后将生成的输出与所需的输出进行比较,以查看代码是否在运行正确地