如何在Mockito中匹配可能的null参数

时间:2016-10-24 18:25:14

标签: mockito

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

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

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

问题#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());

3 个答案:

答案 0 :(得分:32)

来自any()

的javadoc
  

自Mockito 2.1.0 以来,只允许非空String。就这样   是可以为空的引用,建议使用匹配的API   null包装器为isNull()。我们觉得这个   改变将使测试更加安全,与Mockito一样   1.x的。

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

nullable(String.class)

答案 1 :(得分:1)

我通过切换到any(String.class)

来实现这一目标

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

答案 2 :(得分:-2)

怎么样:

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

这对你有用吗?

Matchers.anyObject()允许null s。

Mockito docs中的参考: