2011-11-29 7 views
16

Chcę kpić z odziedziczonej metody chronionej. Nie mogę wywołać tej metody bezpośrednio z kodu java, ponieważ jest ona dziedziczona z klasy w innym pakiecie. Nie mogę znaleźć sposób, aby określić tę metodę do odgałęzienie w w when(...)szyderstwo chronione metoda

package a; 

public class A() { 
    protected int m() {} 
} 

package b; 

public class B extends a.A { 
    // this class currently does not override m method from a.A 
    public asd() {} 
} 

// test 
package b; 

class BTest { 
    @Test 
    public void testClass() { 
     B instance = PowerMockito.spy(new B()); 
     PowerMockito.when(instance, <specify a method m>).thenReturn(123); 
     //PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work 
    } 
} 

Spojrzałem na PowerMockito.when zadajnikami i to wydaje się, że są one tylko dla metod prywatnych!

Jak określić metodę chronioną?

+0

@AndroidKiller, zaktualizowany kod z nazwą klasy. Właściwie mogą pochodzić z Mockito, ale używam powermock i te metody mają to samo znaczenie. –

+0

To jest powód, dla którego powinniśmy zawsze preferować kompozycję ponad dziedziczenie. Jeśli nie możesz po prostu przedefiniować tej metody w swoim testowanym kodzie, tak jak zrobisz ze starszym kodem. – Brice

Odpowiedz

24

Śródstyk: nie zawsze można użyć when dla szpiegów; użyj doReturn.

Zakładając statycznych import spy i doReturn (zarówno PowerMockito):

@RunWith(PowerMockRunner.class) 
@PrepareForTest(B.class) 
public class BTest { 
    @Test public void testClass() throws Exception { 
     B b = spy(new B()); 
     doReturn(42).when(b, "m"); 
     b.asd(); 
    } 
} 

Można również @PrepareForTest(A.class) i skonfigurować doReturn na when(a, "m"). To, co ma większy sens, zależy od rzeczywistego testu.

+0

Wow, dziękuję. Interesujące, gdy próbowałem użyć instancji Method zamiast metody stubbing nazwy łańcucha nie powiodło się z komunikatem wyjątku o błędnej liczbie argumentów. Ale z nazwą ciągu wszystko działa idealnie. –

+0

@mishanesterenko Tak, czasami może być trochę zawiłe. Inną opcją jest zawsze podklasy 'B' dla celów testu. Nie zawsze jest to opcja, ale mniej "magiczna" niż modyfikujący kod bajtowy;) –

+0

Co byś zrobił, gdybyś ustawił powracający Methode void. Powiedzmy, że 'm' jest zbiorem typu Methode podobnego do void m (parser MySpecialParser). Ten parser służy do analizowania mojego tekstu. Jak mogę to wyśmiać? – Kayser

Powiązane problemy