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));