java equals() output,Java:测试系统输出,包括“换行".与assertEquals

I'm currently writing a Unit Test for the Strategy Design Pattern. I'm comparing the System output with a string in the assertEquals method.The output looks the same but my test keeps failing.. . I'm thinking that I'm forgetting something to do with new lines or tabs?

My Unit Test:

import static org.junit.Assert.*;

import java.io.ByteArrayOutputStream;

import java.io.PrintStream;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public class MiniDuck1Test {

private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();

private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();

@Before

public void setUpStreams() {

System.setOut(new PrintStream(outContent));

System.setErr(new PrintStream(errContent));

}

@After

public void cleanUpStreams() {

System.setOut(null);

System.setErr(null);

}

@Test

public void testDuck1() {

Duck mallard = new MallardDuck();

mallard.performQuack();

mallard.performFly();

Duck model = new ModelDuck();

model.performFly();

model.setFlyBehavior(new FlyRocketPowered());

model.performFly();

assertEquals("Quack\nI'm flying!!\nI can't fly\nI'm flying with a rocket", outContent.toString().trim());

}

}

Output (second and third line appear red):

Quack

I'm flying!!

I can't fly

I'm flying with a rocket

Edit:

The quickest solution seemed to be adding an "\r" in front of my "\n". Multiple answers informed me that this needs to be done for Windows. After applying this my assertEquals looked like:

assertEquals("Quack\r\nI'm flying!!\r\nI can't fly\r\nI'm flying with a rocket", outContent.toString().trim());

Also: I forgot to mention that most of the code came from the book: "Head First Design Patterns" by Eric Freeman, Elisabeth Robson, Bert Bates and Kathy Sierra.

解决方案

In addition to the other answers if you are looking for a platform-independent way...

A quick platform-independent solution can be to replace the line separators

String expected = "Quack\nI'm flying!!\nI can't fly\nI'm flying with a rocket"

.replaceAll("\\n|\\r\\n", System.getProperty("line.separator"));

assertEquals(expected, outContent.toString().trim());

or using a PrintWriter to build the expected string.

StringWriter expectedStringWriter = new StringWriter();

PrintWriter printWriter = new PrintWriter(expectedStringWriter);

printWriter.println("Quack");

printWriter.println("I'm flying!!");

printWriter.println("I can't fly");

printWriter.println("I'm flying with a rocket");

printWriter.close();

String expected = expectedStringWriter.toString();

assertEquals(expected, outContent.toString());

or create an own assert class to re-use it

class MyAssert {

public static void assertLinesEqual(String expectedString, String actualString){

BufferedReader expectedLinesReader = new BufferedReader(new StringReader(expectedString));

BufferedReader actualLinesReader = new BufferedReader(new StringReader(actualString));

try {

int lineNumber = 0;

String actualLine;

while((actualLine = actualLinesReader.readLine()) != null){

String expectedLine = expectedLinesReader.readLine();

Assert.assertEquals("Line " + lineNumber, expectedLine, actualLine);

lineNumber++;

}

if(expectedLinesReader.readLine() != null){

Assert.fail("Actual string does not contain all expected lines");

}

} catch (IOException e) {

Assert.fail(e.getMessage());

} finally {

try {

expectedLinesReader.close();

} catch (IOException e) {

Assert.fail(e.getMessage());

}

try {

actualLinesReader.close();

} catch (IOException e) {

Assert.fail(e.getMessage());

}

}

}

}

Then you can give a better problem description if the test fails. E.g.

MyAssert.assertLinesEqual(

"Quack\nI'm flying!!\nI can not fly\nI'm flying with a rocket\n",

outContent.toString());

will output

org.junit.ComparisonFailure: Line 2

Expected :I can not fly

Actual :I can't fly

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值