如何测试不带参数的无效方法将行打印到控制台

问题描述 投票:-1回答:2

对于一项家庭作业,我创建了一个名为Bird的类,其中包含一个方法:

public void launch()
{
     System.out.println("Flapping the wings until take-off");
}

我需要在所有包含的方法(包括类似方法)上运行jUnit测试。但是,当我使用时:

@Test
    void testLaunch()
    {
        Bird myBird = new Bird("Macaw");
        assertEquals("Flapping the wings to take-off", myBird.launch());
    }

我在Eclipse中遇到此错误:“断言类型中的方法assertEquals(short,short)不适用于参数(String,void)”

我很沮丧,因为我们的老师没有教我们如何测试这些方法,他从不回覆我的电子邮件寻求帮助。即使这是一个总体上较弱的问题,也将不胜感激任何帮助。

java junit void println
2个回答
0
投票

您可以使用System.setOut(PrintStream)暂时将standard out替换为以System.setOut(PrintStream)为后盾的内存PrintStream,并使用它来获取输出。类似,

ByteArrayOutputStream

0
投票

通常,您仅测试其中包含某种逻辑的方法。调用System.out.println不视为逻辑。

从测试驱动的角度来看,使用无副作用的方法更容易,因为它们采用一些参数并返回结果,所以您的方法则相反,因此很难测试。

在您的情况下,唯一可行的方法(除了指出您的方法并不复杂,例如尚待测试之外)是将您的方法拆分为一个创建@Test void testLaunch() { PrintStream original = System.out; ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream tps = new PrintStream(baos); Bird myBird = new Bird("Macaw"); System.setOut(tps); myBird.launch(); System.setOut(original); tps.flush(); assertEquals("Flapping the wings to take-off", baos.toString()); } 的方法(可以测试该方法),并调用另一个方法方法并打印结果(调用另一个方法(在另一个类中称为服务)可以在多种框架(例如Mockito)上进行测试。调用System.out.println很难测试,您可以为Stream提取一个Supplier (String)并验证它是否确实返回了System.out,并再次验证在提供的Stream上是否已调用[C​​0]。

查看此测试结构指出了一个事实,基本方法不仅依赖于副作用,而且还同时执行三项操作(而理想方法仅执行一件事)。它创建一个System.out(在此为println),它获取和Object(在此为String),并将它们一起使用(OutStream)。

是的,这看起来似乎过于复杂,但是从学习的角度来看,它表明,即使隐藏在像这样简单的事物中,也存在很多复杂性,如果做得对,可以教很多有关面向对象的设计,清理和S.O.L.I.D.的知识。代码

© www.soinside.com 2019 - 2024. All rights reserved.