【问题标题】:Unit test being confused by three question marks单元测试被三个问号弄糊涂了
【发布时间】:2014-11-19 18:35:14
【问题描述】:

我正在写一些 junit,并进行检查,比较两个 hashmap 的键和值

Iterator<Map.Entry<String, String>> it = expected.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry<String, String> pairs = (Map.Entry<String, String>) it.next();
    assertTrue("Checks key exists", actual.containsKey(pairs.getKey()));
    assertThat("Checks value", actual.get(pairs.getKey()), equalTo(pairs.getValue()));
}

效果很好,但我有一个价值会绊倒它:

java.lang.AssertionError: Checks value
Expected: "Member???s "
     but: was "Member���s "
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)

我检查了数据,数据是正确的。看来三联?不知何故绊倒了一些东西。有谁知道为什么会被绊倒?这对我来说似乎很基本,它甚至没有弄乱 hamcrest,它是真正的断言。

【问题讨论】:

  • 数据从何而来?从一个文件?检查编码。
  • 它来自 Oracle 数据库。它映射到字符串的事实应该使它们相等,不是吗?
  • 将加载的值打印到控制台或写入日志。一定是编码问题。我认为 JUnit/Hamcrest 不是问题。
  • 旁注:你不需要Map.Entry&lt;String, String&gt; pairs = (Map.Entry&lt;String, String&gt;) it.next();中的演员表。
  • 那些看起来像不可打印的字符而不是问号。尝试打印它们的 Unicode 值。

标签: junit hamcrest


【解决方案1】:

您有编码冲突。这可能会以许多不同的方式表现出来,但通常是由于没有全面执行一致的编码造成的。

假设您在某处使用 UTF-8...

  • 如果使用 Maven,请将属性 project.build.sourceEncoding 设置为 UTF-8 See doc for more details。 其他构建系统当然可以选择指定代码和资源文件编码。
  • 如果使用 IO 读取(或写入),总是指定编码。例如,从文件中读取时: InputStream is = new FileInputStream(file), "UTF8");

简而言之,找到任何用于编码的构建系统设置,以及读取文本时涉及 IO 的任何点,并确保设置了所需的编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2019-01-12
    • 1970-01-01
    • 2014-08-14
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多