【问题标题】:Make Hamcrest to match a key or value in a Map使 Hamcrest 匹配 Map 中的键或值
【发布时间】:2021-02-07 13:37:34
【问题描述】:

我为 Hamcrest 和 Map 编写了这个测试程序,以使用 Hamcrest Matchers。 该程序使用 Hamcrest 作为独立程序(不使用 JUnit)。 为什么没有一个输出为真(匹配)? 如何修改这个测试程序以匹配 Map 中的键或值(输出为真)?


    import java.util.Map;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    import org.hamcrest.Matchers;
    import org.hamcrest.collection.IsMapContaining;
    
    public class TestMap {
    
        public static void main(String[] args) {
        
            Map<String, Integer> map = Stream.of(new Object[][] { 
                { "data1", 1 }, 
                { "data2", 2 }, 
            }).collect(Collectors.toMap(data -> (String) data[0], data -> (Integer) data[1]));
    
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                System.out.println("Matchers.hasKey(\"data1\") " + Matchers.hasKey("data1").matches("data1"));
                System.out.println("Matchers.hasValue(1) " + Matchers.hasValue(1).matches(1));
                System.out.println("IsMapContaining.hasKey(\"data1\") " + IsMapContaining.hasKey("data1").matches("data1"));
                System.out.println("IsMapContaining.hasValue(1) " + IsMapContaining.hasValue(1).matches(1));
                System.out.println("IsMapContaining.hasEntry(entry.getKey(), entry.getValue()) " + IsMapContaining.hasEntry(entry.getKey(), entry.getValue()));
            }
        }
    }

输出是:

Matchers.hasKey("data1") false
Matchers.hasValue(1) false
IsMapContaining.hasKey("data1") false
IsMapContaining.hasValue(1) false
IsMapContaining.hasEntry(entry.getKey(), entry.getValue()) map containing ["data2"-><2>]
Matchers.hasKey("data1") false
Matchers.hasValue(1) false
IsMapContaining.hasKey("data1") false
IsMapContaining.hasValue(1) false
IsMapContaining.hasEntry(entry.getKey(), entry.getValue()) map containing ["data1"-><1>]

【问题讨论】:

  • 答案对你有帮助吗,顺便说一句?
  • 是的。谢谢:)。

标签: java collections hamcrest


【解决方案1】:

我只会解释第一个,其余的你可以自己理解(顺便说一句,这不完全是你的错)。

你认为这里会发生什么:

Matchers.hasKey("data1").matches("data1")

让我们阅读hasKey的文档:

当检查的java.util.Map 包含至少一个与指定键相等的键时,为java.util.Maps 匹配创建一个匹配器。

现在,让我们阅读matches 的文档:

此方法匹配 Object,而不是泛型类型 T。这是因为 Matcher 的调用者在运行时不知道类型是什么(因为 Java 泛型的类型擦除)。 检查正确类型取决于实现

理想情况下,您希望编译器 (javac) 只允许您在matches 中指定Map(而不是"data1" 字符串)。毕竟,您确实说过您想将hasKeyMap 进行比较,不是吗?但正如文档中所说:“检查正确类型取决于实现”,javac 不能简单地做到这一点(这是一个限制);你需要自己做。

简单地说,这个Matchers.hasKey("data1").matches("data1") 甚至不应该编译,但是因为这是javac 的工作方式(并且因为hamcrest 设计了这样的代码),所以它确实可以编译,但类型错误。

解决方法很简单:

System.out.println("Matchers.hasKey(\"data1\") " + Matchers.hasKey("data1").matches(map));

注意matches(map)...

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多