AssertEquals(String, String) 内容相同时比较失败

问题描述 投票:0回答:4

我面临以下情况:

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

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

Id 1234 nao encontrado
123, R$ 441,00
321, R$ -8490,00
255, R$ 884,00

打印:

我的测试是:

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)

那么,我在这里做错了什么?

使用 JUnit4 和assertJ 2.4.0 进行测试

java intellij-idea junit4
4个回答
33
投票

可见字符相同,但不可打印字符不同。

您正在将包含 CRLF (

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

简单的解决方案是将字符串中的

\n
替换为
\r\n
。或者从另一个中删除
\r


还值得注意的是,参数排序实际上是

(Object expected, Object actual)
,因此
outContent
应该排在第二位,因为这是“实际”输出。


11
投票

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

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

1
投票

真正的问题在于“行分隔符”的系统配置,而不是单元测试或输入/输出。可能的代码在 Windows 平台上运行,其默认行分隔符为 CRLF 或

\r\n
。然而,Unix 或 Mac 的默认行分隔符为 LF 或
\n

解决此问题的最简单方法是在 IDE 中设置默认行分隔符。例如,IntelliJ 提供了修复此 IDE 或项目范围或文件的优雅方法。请参阅 IntelliJ:配置行分隔符ufeff

IDE / 项目范围

文件


1
投票

使用 JUnit 和 Assertj,您可以比较字符串而忽略行分隔符 (

\r, \n, \r\n
)

import static org.assertj.core.api.Assertions.assertThat;

...

assertThat(resultString).isEqualToIgnoringWhitespace(expectedString);
© www.soinside.com 2019 - 2024. All rights reserved.