簡體   English   中英

驗證是否使用mockito調用了三種方法之一

[英]Verify whether one of three methods is invoked with 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 Matcher:

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

但是這不會編譯“Errors類型中的方法method1(String,String)不適用於參數(Object)”

我有兩個問題:

  1. 我怎么解決這個問題?
  2. 有沒有辦法檢查是否調用了兩種方法中的任何一種? 想象一下,我有另一個名為method2和method3的方法。 我想檢查是否有任何一個被調用(但至少有一個)。

謝謝。

如果調用任何方法,您可以使用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()));

在此處查看doAnswer文檔。

vararg方法有這樣的簽名:

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

你的方法都不是vararg方法。

我不知道Mockito所以我無法為你解決你的問題,但是除非你使用反射,否則上述所有三種方法都沒有可能的抽象,所以我猜你將不得不為上面的每一個使用單獨的案例方法。

您可以攔截對象上的所有調用,例如在這個答案中: Mockito - 攔截模擬上的任何方法調用 ,然后將其與@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);

注意:如果為任何此方法提供其他攔截器 - 將不會調用默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM