对于一项家庭作业,我创建了一个名为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)”
我很沮丧,因为我们的老师没有教我们如何测试这些方法,他从不回覆我的电子邮件寻求帮助。即使这是一个总体上较弱的问题,也将不胜感激任何帮助。
您可以使用System.setOut(PrintStream)
暂时将standard out替换为以System.setOut(PrintStream)
为后盾的内存PrintStream
,并使用它来获取输出。类似,
ByteArrayOutputStream
通常,您仅测试其中包含某种逻辑的方法。调用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上是否已调用[C0]。
查看此测试结构指出了一个事实,基本方法不仅依赖于副作用,而且还同时执行三项操作(而理想方法仅执行一件事)。它创建一个System.out
(在此为println
),它获取和Object
(在此为String
),并将它们一起使用(OutStream
)。
是的,这看起来似乎过于复杂,但是从学习的角度来看,它表明,即使隐藏在像这样简单的事物中,也存在很多复杂性,如果做得对,可以教很多有关面向对象的设计,清理和S.O.L.I.D.的知识。代码