2016-11-09 13 views
5

w klasie MojaKlasa że mogę przetestować mam:Jak sprawdzić, czy określona metoda klasy została przekazana jako parametr?

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

I następuje:

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

A w teście:

@Mock 
Service service; 

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

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

I to działa, ale jak mogę sprawdzić, parametr zamiast dowolnego Runnable był method1, a nie method2?

szukam rozwiązania, które będą wyglądać (Na przykład, nie naprawdę działa):

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

Co rozumiesz przez "jak określić, że parametr był ..." Jeśli musisz wiedzieć, która metoda została wywołana, to może nie być najlepsza implementacja – AxelH

+0

Która zamiast tego, przepraszam za mój słaby angielski, edycja pytanie do wyjaśnienia. – Anton

+2

OK, to tylko w celach testowych ... przegapiłem tę część. Testowanie tego jest trochę dziwne, ponieważ wynik jest ważny, sposób, w jaki można to zrobić, jest nieco trudny do sprawdzenia. Bez żadnej aktualizacji w 'method #()', wątpię, aby był jakiś sposób. – AxelH

Odpowiedz

1

następujące prace dla mnie:

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

}

Kluczem wyodrębnia metodę lambda i używa jej zarówno do wykonania, jak i do weryfikacji. W przeciwnym razie każdy operator "::" tworzy odrębną instancję lambda, która nie działa z testowaniem równości, ponieważ niektóre z powyższych komentarzy omawiały semantykę równości lambda.

Powiązane problemy