Mockito允许我们创建模仿对象,并为我们的测试案例压制行为,我们通常使用when()
和thenReturn()
在模仿对象上嘲笑行为。
Mockito 参数匹配器 - 任何()
有时我们想嘲笑任何类型的论点的行为,在这种情况下,我们可以使用Mockito论点匹配器。Mockito论点方法在‘org.mockito.ArgumentMatchers’类中被定义为静态方法。
1class Foo {
2 boolean bool(String str, int i, Object obj) {
3 return false;
4 }
5
6 int in(boolean b, List<String> strs) {
7 return 0;
8 }
9
10 int bar(byte[] bytes, String[] s, int i) {
11 return 0;
12 }
13}
让我们来看看一些使用mockito论点匹配器来阻止通用行为的例子。
1Foo mockFoo = mock(Foo.class);
2when(mockFoo.bool(anyString(), anyInt(), any(Object.class))).thenReturn(true);
我们正在使用 bool() 方法来返回任何字符串、整数和对象参数的true
。
1assertTrue(mockFoo.bool("A", 1, "A"));
2assertTrue(mockFoo.bool("B", 10, new Object()));
Mockito 参数匹配 - eq()
当我们使用参数匹配时,那么所有参数都应该使用参数匹配。
1when(mockFoo.bool(eq("false"), anyInt(), any(Object.class))).thenReturn(false);
2assertFalse(mockFoo.bool("false", 10, new Object()));
对于列表、设置和地图也有参数匹配者。
1when(mockFoo.in(anyBoolean(), anyList())).thenReturn(10);
如果你想与数组匹配,然后使用任何()方法,如下:
1any(byte[].class)
2any(Object[].class)
Mockito 附加赛事
Mockito org.mockito.AdditionalMatchers
类提供一些很少使用的匹配符. 我们可以指定比,小于,执行 OR, AND, NOT 操作的参数。
1when(mockFoo.bar(any(byte[].class), aryEq(new String[] { "A", "B" }), gt(10))).thenReturn(11);
因此,如果我们将任何字节数组的 bar() 方法称为参数,第二个参数称为 { "A", "B" } 和第三个参数大于 10,那么固定方法将返回 11。
1assertEquals(11, mockFoo.bar("abc".getBytes(), new String[] { "A", "B" }, 20));
2assertEquals(11, mockFoo.bar("xyz".getBytes(), new String[] { "A", "B" }, 99));
Mockito 验证论点匹配者
Mockito 参数匹配器只能使用 when() 和 verify() 方法,让我们看看使用 Mockito verify 方法中的参数匹配器的一些例子。
1verify(mockFoo, atLeast(0)).bool(anyString(), anyInt(), any(Object.class));
2verify(mockFoo, atLeast(0)).bool(eq("false"), anyInt(), any(Object.class));
摘要
Mockito 论点匹配方法非常有用,以一种通用的方式阻止行为. 有许多方法来覆盖几乎所有的要求。
您可以从我们的 GitHub 存储库中查看更多 Mockito 示例。