2011-04-08 22 views
9
的Mockito调用

我有三个方法,如这些的:验证是否三种方法之一与

public void method1(String str){ 
    ... 
} 

public void method1(String str, String str2, String str3){ 
    ... 
} 

public void method1(String str, String str2, Object[] objs, String str3){ 
    ... 
} 

我想给的Mockito检查是否有这些方法被调用,所以我试图用anyVararg匹配:

verify(foo).method1(anyVararg()); 

但这并不编译“类型错误的方法方法1(字符串,字符串)不适用的参数(对象)”

我有两个问题:

  1. 我该如何解决这个问题?
  2. 有没有什么办法来检查是否有两种方法被调用?想象一下,我有另一种叫method2和method3的方法。我想,以检查其中是否被调用(但至少有一个)。

谢谢。

回答

2

一个可变参数的方法具有这样的特征:

public void myMethod(String ... arguments){} 

的你的方法都不是一个可变参数的方法。

我不知道Mockito所以我不能解决你的问题,但没有可能对上述所有三种方法的抽象,除非你使用反射,所以我想你将不得不使用单独的情况下以上每种方法。

+0

哦,好的,谢谢,我误解了http://docs.mockito.googlecode.com/hg/org/mockito/Matchers.html#anyVararg()中的示例有什么要检查是否有任何这些方法被调用? – Juanillo 2011-04-08 12:06:20

7

如果调用任何方法,可以使用Answer来增加计数器。

private Answer incrementCounter = new Answer() { 
    public Object answer(InvocationOnMock invocation) throws Throwable { 
     counter++; 
     return null; 
    }   
}; 

请注意,您需要存根所有方法。一种方法的独特性是基于其签名,而不仅仅是方法的名称。两个同名的方法仍然是两种不同的方法。

doAnswer(incrementCounter).when(mockObj.method1(anyString())); 
doAnswer(incrementCounter).when(mockObj.method1(anyString(), anyString())); 
doAnswer(incrementCounter).when(mockObj.method2(anyString())); 

doAnswerhere查看文档。

+0

什么是doAswer方法,它是中的Mockito一部分? – 2016-10-04 13:48:18

+1

@AbdenaceurLichiheb是它的静态方法'org.mockito.Mockito.doAnswer' – 2016-10-04 15:09:40

0

您可以拦截在所有对象调用像这样的回答: Mockito - intercept any method invocation on a mock ,然后把与方法,通过@Bozho建议结合本:

private Answer incrementCounter = new Answer() { 
    public Object answer(InvocationOnMock invocation) throws Throwable { 
     if (invocation.getMethod().getName().eqauls("someMethid")) { 
      counter++; 
     } 
     return null; 
    }   
}; 

VendorObject mockObj = mock(SomeClass.class, incrementCounter); 

注意:如果你对任何的这种方法提供了其他的拦截器 - 默认不会被调用。

相关问题