2016-11-09 49 views
5

在MyClass類,我考我:如何驗證特定的類方法是否作爲參數傳遞?

public void execute(){ 
    service.call(ThisClass::method1); 
} 

與以下:

void method1(){do 1;} 
void method2(){do 2;} 

而且在測試:

@Mock 
Service service; 

@Test 
public void testCallMethod1() 
{ 
    MyClass myClass = new MyClass(); 
    myClass.execute(); 

    service.verify(any(Runnable.class)); 
} 

和它的作品,但是,我怎麼驗證參數而不是任何Runnable是method1而不是method2?

我正在尋找解決方案,它看起來像(例如,並非真正的作品):

service.verify(eq(MyClass::method1.getRunnable())) 
+0

你說的'我怎麼指定參數的意思是......'如果你需要知道哪些方法被調用,這可能不是最好的實現 – AxelH

+0

其中的而不是,對不起我的英文不好,編輯這個問題要澄清。 – Anton

+2

好吧,這只是爲了測試目的...錯過了那部分。測試這個有點奇怪,因爲結果很重要,實現它的方法有點難以檢查。沒有''方法#()'中的任何更新,我懷疑是否有辦法。 – AxelH

回答

1

對我來說,以下工作:

public class MyTest { 

public static class X{ 
    static void method1() {}; 
    static void method2() {}; 
} 

@Test 
public void throwAway() { 
    ExecutorService service = mock(ExecutorService.class); 
    Runnable command1 = X::method1; 
    Runnable command2 = X::method2; 
    service.execute(command1); 
    verify(service).execute(command1); 
    verify(service, never()).execute(command2); 
} 

}

的關鍵正在提取方法引用lambda並在執行和驗證中使用它。否則,每個「::」運算符產生一個獨立的lambda實例,它不適用於相等性測試,因爲上面的一些註釋討論了lambda相等的語義。

相關問題