我无法轻松地验证子类型类对采用超类型的方法的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.
}
verify times(1)失败...它看到2个调用而不是1个调用,可能是因为方法签名中B的引用是超级类型A。
问题是我无法唯一地验证每个通话
我知道我可以切换到eq(b)和eq(c)而不是any(),但是在我的真实情况下我无法处理它们,因为它们是在被测试对象中创建的。另一个选择可能是做一个ArgumentCaptor并测试实例,但是它很烦人。
还有其他解决方案吗?
最佳答案
您可以使用isA
:
verify(x, times(1)).doSomething(isA(B.class));
http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Matchers.html
any家族方法不执行任何类型检查,仅在此处进行以避免类型转换。如果要执行类型检查,请使用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));
}
}
关于java - Mockito验证通过的子类型仅看到 super 类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30668168/