【问题标题】:JUnit - string check fails because of \nJUnit - 字符串检查失败,因为 \n
【发布时间】:2015-09-06 15:27:13
【问题描述】:

我有一个检查文本块的 JUnit 测试用例。有硬编码的“正确”值:

String CORRECT_VAL = "First\\nSecond";

json是这样生成的:

String json =
            "{\n" +
            "    \"val\":\"" + CORRECT_VAL + "\",\n" +
            "}";

这个 String 被 org.json 转换为 JSONObject。但是后来测试失败了:

expected:<First[\r\n]Second> but was:<First[
]Second>

所以我在控制台中也看到了“\n”。 :(


评论尝试 1":

expected:<First\[\]nSecond> but was:<First\[]nSecond>
Expected :First\\nSecond
Actual   :First\nSecond

评论尝试 2":

expected:<First[\r\n]Second> but was:<First[
]Second>

【问题讨论】:

  • 您是否尝试过转义转义斜线? "First\\\\nSecond"
  • @Parris Varney:结果见问题。

标签: java string testing junit console


【解决方案1】:

\是一个特殊符号,用于标记某些特殊字符:

例如,\n 将被转换为换行符。

\\ 表示转义反斜杠,因此将其转换为单个反斜杠。由于一个反斜杠是一个特殊符号,如果您想在您的 java 代码中编写一个实际的反斜杠,您需要这样做。 (当从文件中读取时,整个事情不会发生,只是在你的代码中编写它时)。

\\n 的字面意思是“一个反斜杠,后跟一个 'n'”。那里没有换行符。

因此,您要么必须在结果中要求正确的字符,要么在 json 中写入正确的字符。目前,您正在将“\n”(换行符)与“\\n”(反斜杠,后跟 n)进行比较。或者,在您的其他示例中,“\n”(换行符)和“\\\\n”(两个反斜杠,后跟一个 n)。

你的信息告诉你的是,你正在做这个检查:

 Assert.assertEquals("First\\r\\nSecond", "First\r\nSecond");

...或者这个...

 Assert.assertEquals("First\\r\\nSecond", "First\nSecond");

换句话说,预期的字符串有“\r\n”(四个字符),而实际的字符串有某种实际的换行符,例如 '\r' + '\n' (回车,后跟按换行符)(两个字符)。

您期待的是 TEXT,字面意思是“\r\n”。但是你得到的可能是由'\r'后跟符号'\n'表示的SYMBOL,这将导致实际的换行。

【讨论】:

  • JSON 是数据库结果的示例。那么如何在数据库中存储换行符,以便测试有效呢?
  • 预期值\r\n 不符合您所写的内容,抱歉。那不是\\n。 '\\n' 也不是换行符,所以它也不是实际值。有些东西不像你在这里引用的那样。我不知道您的数据库中实际存储了什么。换行符可以以各种格式存储(Windows、Unix、转义、未转义等),所以很难说。我会检查数据库的实际输出是什么(可能通过打印出每个字符的代码)。
  • 我已经检查过了。我正在使用 HeidiSQL,它使用\r\n 插入换行符。
  • 如果它使用两个字符 '\r' 和 '\n',那么这就是你应该检查的。
  • 更新问题。如您所见,将数据解析为 json 字符串,然后解析为 jsonobject,然后解析为字符串,它将 \r\n 替换为其正确含义。所以结果是正确的,如果我想把 json 对象中的字符串打印出来。但是 JUnit 认为它是错误的 :(
【解决方案2】:

我已经在测试类本身中创建了 json 字符串,所以我使用了 First\\nSecond,因为 \n 必须在 json 字符串中进行转义。

但是我也查了结果是First\\nSecond,但是这是错误的。

在 JSON 中插入:First\\nSecond
检查:First\nSecond

使用 commons-lang3:
StringEscapeUtils.unescapeJava("First\\nSecond").equals(jsono.getString("key"));

【讨论】:

    【解决方案3】:

    问题在于 \r 而不是 \n。在处理测试用例时,我也遇到了类似的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2018-10-16
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多