Mockito参数匹配器– any(),eq()
时间:2020-02-23 14:40:43 来源:igfitidea点击:
Mockito允许我们创建模拟对象并为测试用例添加行为。
我们通常在模拟对象上使用when()
和thenReturn()
模拟行为。
Mockito参数匹配器– any()
有时我们想要模拟给定类型的任何参数的行为,在这种情况下,我们可以使用Mockito参数匹配器。
Mockito参数方法在org.mockito.ArgumentMatchers类中定义为静态方法。
假设我们有一个定义为的类:
class Foo { boolean bool(String str, int i, Object obj) { return false; } int in(boolean b, List<String> strs) { return 0; } int bar(byte[] bytes, String[] s, int i) { return 0; } }
让我们看一些使用模仿参数匹配器存根一般行为的示例。
Foo mockFoo = mock(Foo.class); when(mockFoo.bool(anyString(), anyInt(), any(Object.class))).thenReturn(true);
我们正在使用bool()方法为任何字符串,整数和对象参数返回" true"。
在这种情况下,以下所有断言都将通过:
assertTrue(mockFoo.bool("A", 1, "A")); assertTrue(mockFoo.bool("B", 10, new Object()));
Mockito参数匹配器– eq()
当我们使用参数匹配器时,所有参数都应使用匹配器。
如果我们想为参数使用一个特定的值,那么我们可以使用eq()方法。
when(mockFoo.bool(eq("false"), anyInt(), any(Object.class))).thenReturn(false); assertFalse(mockFoo.bool("false", 10, new Object()));
列表,集合和映射也有参数匹配器。
when(mockFoo.in(anyBoolean(), anyList())).thenReturn(10);
如果要与数组匹配,请使用any()方法,如下所示:
any(byte[].class) any(Object[].class)
Mockito附加匹配项
Mockitoorg.mockito.AdditionalMatchers
类提供了一些很少使用的匹配器。
我们可以指定参数大于,小于执行OR,AND,NOT操作。
我们还可以检查数组是否相等。
when(mockFoo.bar(any(byte[].class), aryEq(new String[] { "A", "B" }), gt(10))).thenReturn(11);
因此,如果我们调用带有任何字节数组作为参数,第二个参数为{" A"," B"}且第三个参数大于10的bar()方法,则存根方法将返回11。
下面的断言将传递给我们的存根方法。
assertEquals(11, mockFoo.bar("abc".getBytes(), new String[] { "A", "B" }, 20)); assertEquals(11, mockFoo.bar("xyz".getBytes(), new String[] { "A", "B" }, 99));
Mockito验证参数匹配器
Mockito参数匹配器只能与when()和verify()方法一起使用。
让我们看一些在Mockito verify方法中使用参数匹配器的示例。
verify(mockFoo, atLeast(0)).bool(anyString(), anyInt(), any(Object.class)); verify(mockFoo, atLeast(0)).bool(eq("false"), anyInt(), any(Object.class));