Java 内容相同时AssertEquals(字符串,字符串)比较失败

Java 内容相同时AssertEquals(字符串,字符串)比较失败,java,intellij-idea,junit4,Java,Intellij Idea,Junit4,我面临以下情况: 我有一个应用程序,它可以将所有内容都输出到STDOUT(简单公司测试)中,我正在尝试将其JUnit 我的问题是,当我运行应用程序时,它会在控制台中返回我: (从IntelliJ复制并粘贴) 打印: 我的测试是: assertEquals(outContent.toString().trim(),"Id 1234 nao encontrado\n" + "123, R$ 441,00\n" + "321, R$ -

我面临以下情况:

我有一个应用程序,它可以将所有内容都输出到STDOUT(简单公司测试)中,我正在尝试将其JUnit

我的问题是,当我运行应用程序时,它会在控制台中返回我: (从IntelliJ复制并粘贴)

打印:

我的测试是:

assertEquals(outContent.toString().trim(),"Id 1234 nao encontrado\n" +
                "123, R$ 441,00\n" +
                "321, R$ -8490,00\n" +
                "255, R$ 884,00");
我得到:

junit.framework.ComparisonFailure:  <Click to see difference>


    at junit.framework.Assert.assertEquals(Assert.java:100)
    at junit.framework.Assert.assertEquals(Assert.java:107)
    at junit.framework.TestCase.assertEquals(TestCase.java:269)
    at com.company.AccountManagerTest.testPrintAccountsBalance(AccountManagerTest.java:85)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at junit.framework.TestCase.runTest(TestCase.java:176)
    at junit.framework.TestCase.runBare(TestCase.java:141)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:129)
    at junit.framework.TestSuite.runTest(TestSuite.java:252)
    at junit.framework.TestSuite.run(TestSuite.java:247)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
junit.framework.ComparisonFailure:
位于junit.framework.Assert.assertEquals(Assert.java:100)
位于junit.framework.Assert.assertEquals(Assert.java:107)
位于junit.framework.TestCase.assertEquals(TestCase.java:269)
在com.company.AccountManagerTest.testPrintAccountsBalance(AccountManagerTest.java:85)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于junit.framework.TestCase.runTest(TestCase.java:176)
位于junit.framework.TestCase.runBare(TestCase.java:141)
位于junit.framework.TestResult$1.protect(TestResult.java:122)
位于junit.framework.TestResult.runProtected(TestResult.java:142)
运行(TestResult.java:125)
运行(TestCase.java:129)
位于junit.framework.TestSuite.runTest(TestSuite.java:252)
运行(TestSuite.java:247)
位于org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
位于org.junit.runner.JUnitCore.run(JUnitCore.java:137)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

那么,我做错了什么


使用JUnit4和assertJ 2.4.0测试时,可见字符相同,但不可打印字符不同

您正在将包含CRLF(
\r\n
)的预期输出与仅包含LF(
\n
)的实际输出进行比较。您可以在两个文本区域的右侧上方的IntelliJ中看到这一点

简单的解决方案是用
\r\n
替换字符串中的
\n
。或从另一个中删除
\r


还值得注意的是,参数顺序实际上是
(预期对象,实际对象)
,因此
outContent
应该排在第二位,因为这是“实际”输出

您可以使用AssertJ“IseQualtNormalizingNewline”,如下所示:


如果不确定字符串是否具有
\r
,另一种解决方案是使用
outContent.toString().trim().replace(“\r”,”)
作为实际字符串。也就是说,在比较之前删除所有
\r
字符。除了手动查看之外,还有什么方法可以调试它吗?有31个不可打印的字符,所以我想说,如果你真的不关心它们,那么就把它们全部去掉。
junit.framework.ComparisonFailure:  <Click to see difference>


    at junit.framework.Assert.assertEquals(Assert.java:100)
    at junit.framework.Assert.assertEquals(Assert.java:107)
    at junit.framework.TestCase.assertEquals(TestCase.java:269)
    at com.company.AccountManagerTest.testPrintAccountsBalance(AccountManagerTest.java:85)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at junit.framework.TestCase.runTest(TestCase.java:176)
    at junit.framework.TestCase.runBare(TestCase.java:141)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:129)
    at junit.framework.TestSuite.runTest(TestSuite.java:252)
    at junit.framework.TestSuite.run(TestSuite.java:247)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
import static org.assertj.core.api.Assertions.assertThat;

...

@Test
public void ingoreLineEndingCharacterTest() {
    assertThat("First Line\nSecond Line\n").isEqualToNormalizingNewlines("First Line\r\nSecond Line\r\n");
}