Mockito验证传递的子类型只能看到超类型

时间:2015-06-05 13:46:31

标签: java mockito verify

我不能轻易地验证子类型类的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并测试实例,但它很烦人。

还有其他解决方案吗?

1 个答案:

答案 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));
  }
}