2016-11-09 17 views
5

var:Belirli bir sınıf yönteminin parametre olarak nasıl geçtiğini doğrulamak için? Ben I sınamak class Sınıfım olarak

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

Ve aşağıdaki:

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

Ve testinde

:

@Mock 
Service service; 

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

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

Ve çalışır, ancak, bunu nasıl doğrularım Herhangi bir Runnable yerine parametre method1 ve method2 değil miydi?

Ben benzeyecek çözüm arıyorum (Örneğin, gerçekten çalışır): Benim için

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

Ne demek 'Bu parametrenin nasıl olduğunu belirtmeliyim ...' Hangi yöntemin çağrıldığını bilmeniz gerekiyorsa, bu en iyi uygulama olmayabilir – AxelH

+0

Bunun yerine, kötü İngilizce'm için üzgünüm düzenleme netleştirmek için soru. – Anton

+2

Tamam, bu sadece test amaçlı ... bu kısmı kaçırdı. Bunu test etmek biraz garip çünkü sonuç önemli, bunu başarmanın yolu kontrol edilmesi biraz zor. Method #() 'da herhangi bir güncelleme yapılmadan, bir yol olduğundan şüpheliyim. – AxelH

cevap

1

aşağıdaki çalışır:

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

}

anahtar yöntem referans lambda ayıklanıyor ve hem yürütme hem de doğrulamada kullanılıyordu. Aksi takdirde, her bir "::" operatörü eşitlik testi ile çalışmayan ayrı bir lambda örneği üretir, çünkü yukarıdaki bazı yorumlar lambda eşitliğinin semantiğini tartışmaktadır.

İlgili konular