gpt4 book ai didi

Java:使用 assertEquals 测试系统输出,包括 "new lines"

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:51 24 4
gpt4 key购买 nike

我目前正在为策略设计模式编写单元测试。我正在将系统输出与 assertEquals 方法中的字符串进行比较。输出看起来相同,但我的测试一直失败......。我在想我忘记了与新行或制表符有关的事情?

我的单元测试:

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());
}
}

输出(第二行和第三行显示为红色):

Quack
I'm flying!!
I can't fly
I'm flying with a rocket

编辑:

最快的解决方案似乎是在我的“\n”前面添加一个“\r”。多个答案告诉我这需要为 Windows 完成。应用这个之后我的 assertEquals 看起来像:

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

另外:我忘了说大部分代码都来自 Eric Freeman、Elisabeth Robson、Bert Bates 和 Kathy Sierra 合着的“Head First Design Patterns”一书。

最佳答案

除了其他答案之外,如果您正在寻找一种独立于平台的方式...

一个快速的独立于平台的解决方案可以是替换行分隔符

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());

或使用 PrintWriter 构建预期的字符串。

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());

或者创建一个自己的断言类来重用它

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());
}
}
}
}

然后如果测试失败你可以给出更好的问题描述。例如

MyAssert.assertLinesEqual(
"Quack\nI'm flying!!\nI can not fly\nI'm flying with a rocket\n",
outContent.toString());

会输出

org.junit.ComparisonFailure: Line 2 
Expected :I can not fly
Actual :I can't fly

关于Java:使用 assertEquals 测试系统输出,包括 "new lines",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41674408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com