【问题标题】:problems with hamcrest matcher and argThat methodhamcrest 匹配器和 argThat 方法的问题
【发布时间】:2016-08-19 07:41:35
【问题描述】:

我的测试类中有这段代码:

then(collector()).should().emit(eq(myStream), eq(myTuple),
        argThat(allOf(hasItem(anyString()), hasItem("test1"), hasItem("test2"))));

问题是我不知道第一个Item的值。我只知道该值的类型为String

如果我执行测试,我会收到消息:

参数匹配器的使用无效!预计 3 个匹配者,5 个记录

此外:

如果匹配器与原始值组合,则可能会发生此异常: //不正确: someMethod(anyObject(), "原始字符串");使用匹配器时,所有参数都必须由匹配器提供。例如: //正确的: someMethod(anyObject(), eq("String by matcher"));

我看不到问题。

感谢您的帮助。

【问题讨论】:

  • 看起来你的 anyString 来自 Mockito 而不是 Hamcrest...
  • 你能添加你的导入吗?
  • 嗨,鲍里斯。你说的对。它适用于任何(String.class)。给它作为答案,我会接受它。谢谢帮助
  • @StefanBeike 我仍然反对 Manu 说你应该发布你的导入。 Boris 是对的,emit 应该为每个参数都有一个 Mockito 匹配器,allOf 应该只包含 Hamcrest 匹配器,但如果 anyString 是第四个匹配器,我看不出第五个记录匹配器的来源。

标签: java junit mockito hamcrest


【解决方案1】:

问题是嵌套匹配器时不能使用 Mockito 匹配器。您必须改用 Hamcrest 或其他自定义匹配器。根本问题是 argThat 被视为模拟匹配器以及 anyString() 并且这些匹配器被应用于导致错误的单个参数(我不知道为什么模拟不支持这一点)。将 anyString 转换为 Hamcrest 匹配器应该可以解决问题。请尝试以下操作:

then(collector()).should().emit(eq(myStream), eq(myTuple),
    argThat(allOf(hasItem(isA(String.class)), hasItem("test1"), hasItem("test2"))));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多