Mockito 验证传递的子类型只看到超类型
Mockito Verify on passed sub type only sees super type
我无法轻易验证子类型 class 对采用超类型
的方法的 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.
}
验证 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
The any family methods don't do any type checks, those are only here to avoid casting in your code. If you want to perform type checks use the isA(Class) method. This might however change (type checks could be added) in a future major release.
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));
}
}
我无法轻易验证子类型 class 对采用超类型
的方法的 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.
}
验证 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
The any family methods don't do any type checks, those are only here to avoid casting in your code. If you want to perform type checks use the isA(Class) method. This might however change (type checks could be added) in a future major release.
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));
}
}