我正在尝试验证我正在测试的类是否调用了正确的依赖类的方法。因此,我试图匹配方法参数,但我并不真正关心这个测试中的实际值,因为我不想让我的测试变得脆弱。
然而,我遇到了麻烦设置,因为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文档中的参考: