(四)参数匹配器 (matchers)
乙醇 创建于 almost 7 years 之前
最后更新: less than a minute 之前
阅读数: 233
参数匹配器 (matchers)
Mockito以自然的java风格来验证参数值: 使用equals()函数。有时,当需要额外的灵活性时你可能需要使用参数匹配器,也就是argument matchers : 例子
import org.junit.Test;
import java.util.LinkedList;
import static org.mockito.Mockito.*;
public class MockitoDemo {
@Test
public void with_arguments(){
LinkedList mockedList = mock(LinkedList.class);
//stubbing using built-in anyInt() argument matcher
// 使用内置的anyInt()参数匹配器
when(mockedList.get(anyInt())).thenReturn("element");
//following prints "element"
// 输出element
System.out.println(mockedList.get(1));
//you can also verify using an argument matcher
// 你也可以验证参数匹配器
verify(mockedList).get(anyInt());
}
}
参数匹配器使验证和测试桩变得更灵活。点击这里查看更多内置的匹配器以及自定义参数匹配器或者hamcrest 匹配器的示例。
如果仅仅是获取自定义参数匹配器的信息,查看ArgumentMatcher类文档即可。
为了合理的使用复杂的参数匹配,使用equals()与anyX() 的匹配器会使得测试代码更简洁、简单。有时,会迫使你重构代码以使用equals()匹配或者实现equals()函数来帮助你进行测试。
同时建议你阅读ArgumentCaptor类文档。ArgumentCaptor是一个能够捕获参数值的特俗参数匹配器。
自定义参数匹配器
例子:
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import java.util.LinkedList;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.*;
public class MockitoDemo {
@Test
public void with_arguments2(){
LinkedList mockedList = mock(LinkedList.class);
//stubbing using custom matcher (let's say isValid() returns your own matcher implementation):
// 使用自定义的参数匹配器( 在IsValid()类中返回你自己的匹配器实现 )
when(mockedList.contains(argThat(new IsValid()))).thenReturn(true);
assertTrue(mockedList.contains(1));
assertTrue(!mockedList.contains(3));
}
private class IsValid extends ArgumentMatcher<List> {
@Override
public boolean matches(Object o) {
return o.equals(1) || o.equals(2);
}
}
}
上面的例子中我们自己定义了 IsValid 类,处理不同参数时的返回。