如何匹配一个可能的空参数在Mockito



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

然而,我遇到了麻烦设置,因为Mockito已经决定,我所期待的行为是一个bug: https://github.com/mockito/mockito/issues/134

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

对于问题#134 "fixed",此代码失败,因为匹配器仅在第一种情况下匹配。我如何定义一个匹配器在所有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());

From javadocs of any()

从Mockito 2.1.0开始,只允许非空的String。因为这是一个可空的引用,建议的API 匹配null包装器将是isNull()。我们感觉到了变更将使测试工具比使用Mockito时更加安全1. x。

因此,匹配可空字符串参数的方法是显式声明:
nullable(String.class)

通过切换到any(String.class)

,我得到了这个工作

我发现这有点误导,因为API似乎表明anyString()只是any(String.class)的别名,至少在2.0更新之前。公平地说,文档确实指定anyString()只匹配非空字符串。

因为您配置了anyString(),但您传递的是空值。anyString()不允许对anyString()使用null,使用nullable(String.class)允许参数可以为null。

将代码替换为:

verify(c, times(4)).foo(nullable(String.class), nullable(String.class));

如何:

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

这对你有用吗?

Matchers.anyObject()允许null秒。

Mockito文档中的参考:

相关内容

  • 没有找到相关文章

最新更新