我不能轻易地验证子类型类的2个单独和唯一调用到一个超类型的方法
我有一个像这样的场景......
B和C都扩展了抽象类型A
使用
public class X {
public String doSomething(A a){
return "";
}
}
测试
@Test
public void testExtensionVerify(){
X x = mock(X.class);
B b = new B();
C c = new C();
x.doSomething(b);
x.doSomething(c);
verify(x, times(1)).doSomething(any(B.class)); //fails.
}
验证次数(1)失败...它看到2次调用而不是1次,因为方法签名中的B引用是超级类型A.
问题在于我无法唯一地验证每个呼叫
我知道我可以切换到eq(b)和eq(c)而不是任何()但是在我的实际情况下我没有处理它们,因为它们是在被测试的对象中创建的。另一个选择可能是做一个ArgumentCaptor并测试实例,但它很烦人。
还有其他解决方案吗?
答案 0 :(得分:1)
您可以使用isA
:
verify(x, times(1)).doSomething(isA(B.class));
http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Matchers.html
任何系列方法都不进行任何类型检查,这些仅用于避免在代码中进行转换。如果要执行类型检查,请使用isA(Class)方法。但是,这可能会在未来的主要版本中发生变化(可以添加类型检查)。
public class XTest {
@Test
public void testExtensionVerify(){
X x = mock(X.class);
B b = new B();
C c = new C();
x.doSomething(b);
x.doSomething(c);
verify(x, times(1)).doSomething(isA(B.class));
verify(x, times(1)).doSomething(isA(C.class));
}
}