【问题标题】:How to match a possible null parameter in Mockito如何在 Mockito 中匹配可能的空参数
【发布时间】:2016-10-24 18:25:13
【问题描述】:

我正在尝试验证我正在测试的类是否调用了正确的依赖类的方法。所以我正在尝试匹配方法参数,但我并不真正关心这个测试中的实际值,因为我不想让我的测试变脆。

但是,我在设置它时遇到了麻烦,因为 Mockito 已确定我所期望的行为是一个错误:https://github.com/mockito/mockito/issues/134

那么为可能是null 的参数定义ArgumentMatcher 的正确方法是什么?

对于问题 #134 “已修复”,此代码失败,因为匹配器仅在第一种情况下匹配。如何定义一个匹配器以在所有 4 种情况下工作?

MyClass c = mock(MyClass.class);

c.foo("hello", "world");
c.foo("hello", null);
c.foo(null, "world");
c.foo(null, null);

verify(c, times(4)).foo(anyString(), anyString());

【问题讨论】:

    标签: mockito


    【解决方案1】:

    来自any()的javadocs

    自 Mockito 2.1.0 起,只允许非空 String。作为这个 是一个可为空的引用,建议的 API ma​​tch null 包装器将是 isNull()。我们感受到了这一点 更改将使测试工具比使用 Mockito 更安全 1.x.

    所以,匹配可空字符串参数的方法是显式声明:

    nullable(String.class)
    

    【讨论】:

    • 我相信这是正确的答案,而不是建议“any(String.class)”的答案。
    • 完美运行!谢谢。 public static <T> T nullable(Class<T> clazz) 为空或给定类型的参数。来自文件的参考:javadoc.io/static/org.mockito/mockito-core/3.1.0/org/mockito/…
    • 并且只匹配 null woth other matechers ,Mockito.isNull()
    【解决方案2】:

    我通过切换到 any(String.class) 来实现这个功能

    我觉得这有点误导,因为 API 似乎暗示 anyString() 只是 any(String.class) 的别名,至少在 2.0 更新之前是这样。公平地说,文档确实指定 anyString() 仅匹配非空字符串。这对我来说似乎违反直觉。

    【讨论】:

    • 这似乎是从 Mockito 2.0 开始的正确答案。在 2.0 之前的 Mockito 版本中,您使用 anyString() 的原始代码本来可以工作,但这是 Mockito 团队在 2.0 中引入的一项重大更改。
    • 这不再起作用了。来自文档 - Since Mockito 2.1.0 this method will perform a type check thus <code>null</code> values are not authorized
    • 我同意最后的评论,这个答案是不正确的。上一个推荐“nullable(String.class)”的答案可能是正确的答案。我在自己的 v2.15.0 测试中证实了这一点。
    【解决方案3】:

    怎么样:

    verify(c, times(4)).foo(anyObject(), anyObject());
    

    这对你有用吗?

    Matchers.anyObject() 允许nulls。

    参考Mockito docs:

    【讨论】:

    • 不,因为那时我的 IDE 抱怨 foo(String, String) 不能被 foo(Object, Object) 调用
    • 你可能只使用捕获any()的类型,但anyObject返回Object,所以不能工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多