JUnit断言:检查Object是否等于String

Lin*_*ton 6 java junit android assertions

我已Map声明如下:

Map<String, Object> data
Run Code Online (Sandbox Code Playgroud)

我把String它放进去并验证它的价值如下:

assertEquals("value", data.get("key"));
Run Code Online (Sandbox Code Playgroud)

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

assertThat(data.get("key"), equalTo("value"));
Run Code Online (Sandbox Code Playgroud)

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

Wrong 2nd argument type. Found: 'org.hamcrest.Matcher<java.lang.String>', required: 'org.hamcrest.Matcher<? super java.lang.Object>' less...

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

Gho*_*ica 5

做事的“ more assertThat”方法是:

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

asssertThat(data, is(expectedData));
Run Code Online (Sandbox Code Playgroud)

请注意:

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

对于您的特定问题:这是因为泛型在这里起什么作用;可能足以使用(String) data.get("key")-告诉编译器“实际”参数的类型为String。

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

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));
}
Run Code Online (Sandbox Code Playgroud)

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