在mockito中我们mock某个对象的行为时,可以使用doReturn when句法
# 当list调用get方法并且参数是任意Int时返回mockedList
doReturn(mockedList).when(list).get(anyInt());
# 当list调用get方法并且参数是1时返回mockedList2
doReturn(mockedList2).when(list).get(1);
被mock对象的行为默认参数只提供了anyInt(),anyString(),anyChar()等基础类型对象,当然我们也可以直接提供基础类型变量比如1,2,3,"string"等来进行精确行为定制。
但如果我们想mock的对象的行为参数类型是自定义类型,比如
public class A {
private int id;
private String name;
public A(int id, String name) {
this.id = id;
this.name = name;
}
}
A a = new A(1, "Anni");
doReturn(mockedList).when(list).get(a);
我的原意是想list调用get时并且get参数是A类型,并且id为1,name为Anni的时候才会返回mockedList。但是这里的参数实例是新new的a,list实际调用的时候即使传入的是A的实例,并且id和name与a相同,但依然是两个不同的实例对象,对象地址不同,所以他们即使内容相同也不会匹配,想让他们匹配,必须重写equals方法。但是,我们又不能仅仅为了测试而修改类的equals方法......
此时,我们可以通过实现ArgumentMatcher接口来完成目标:
public class AArgMatcher implements ArgumentMatcher<A> {
private A a;
public AArgMatcher(A a) {
this.a = a;
}
@Override
public boolean matches(A a) {
return (this.a.id == a.id && this.a.name.equals(a.name));
}
}
如下使用就可以精确匹配id为1,name为Anni的对象了。
A a = new A(1, "Anni");
doReturn(mockedList).when(list).get(argThat(new AArgMatcher()));