【问题标题】:JUnit assertThat: check that Object equals StringJUnit assertThat:检查 Object 是否等于 String
【发布时间】:2017-02-18 18:13:09
【问题描述】:

我已将Map 声明如下:

Map<String, Object> data

我在里面放了一个String 并像这样验证它的值:

assertEquals("value", data.get("key"));

现在,我想重写验证以使用 assertThat 而不是 assertEquals。我尝试了以下方法:

assertThat(data.get("key"), equalTo("value"));

当然,由于类型不匹配,它不起作用:

Wrong 2nd argument type. Found: 'org.hamcrest.Matcher&lt;java.lang.String&gt;', required: 'org.hamcrest.Matcher&lt;? super java.lang.Object&gt;' less...

String 的第一个参数的显式类型转换有帮助,但我想避免它。例如assertEquals 不需要类型转换。 那么,如何使用assertThat 方法检查放入上面声明的Map 对象的值是否等于特定的String

【问题讨论】:

  • 将 data.get 转换为字符串可能会有所帮助
  • 是的,它有帮助。关键是我想避免显式类型转换。寻找一种方法让它像 assertEquals 一样工作,但使用 assertThat。
  • Matcher.&lt;Object&gt;equalTo("value").

标签: java android junit assertions


【解决方案1】:

“更断言”的做事方式是:

Map<String, Object> expectedData = Collections.singletonMap("key", "value");

asssertThat(data, is(expectedData));

请注意:

  • 也许您需要类型提示来调用 singletonMap
  • 除了 is 匹配器之外,还有其他匹配器可以让您检查数据是否包含您的“预期”地图数据

对于您的具体问题:这是因为泛型在这里发挥作用;使用(String) data.get("key") 可能就足够了 - 告诉编译器“实际”参数是字符串类型。

最后 - 我不知道你的问题是什么。我写下了这段代码:

public void test() {
    Map<String, Object> data = new HashMap<>();
    data.put("key", "value");
    assertThat(data.get("key"), is("value"));

    Map<String, Object> expectedData = Collections.singletonMap("key", "value");
    assertThat(data, is(expectedData));
}

它编译良好,单元测试运行并通过。换句话说:实际上我无法重现您的问题。

【讨论】:

  • 不幸的是,“is”与“equalsTo”有同样的问题。如果没有明确的类型转换为 String,我似乎无法实现我想要的。
  • 请看我更新的答案。事情对我有用(两种方式),无需任何转换(但准确地说:使用 Java8)。在 Java7 中,类型推断可能会给您带来问题;要求你放下那个演员。
  • 嗯,再次检查您的示例并遇到与以前相同的问题。所以它绝对看起来像任何东西的版本不匹配。我会继续研究和检查。
  • 让措辞更加准确:没有“版本”不匹配。我要说的是:我的代码在 Java8 上运行良好。当您使用 Java 的较旧版本时,类型推断 的效果不太好;因此较旧的 Java 可能仅适用于硬编码强制转换。
  • 是的,这就是我的意思。对不起,如果它让你感到困惑。至少您的评论表明所需的方法正在发挥作用。
【解决方案2】:

试试这个

assertThat(data.get("key"), equalTo("value"))

    assertThat(data.get("key"), CoreMatchers.equalTo("value"))

【讨论】:

猜你喜欢
  • 2013-05-15
  • 2013-11-17
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多