我无法轻松地验证子类型类对采用超类型的方法的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/

10-11 22:40
查看更多