2014-04-10 10 views
11

Opracowałem aplikację w Javie i próbuję tworzyć testy jednostkowe za pomocą Powermockito (powinienem dodać, że jestem nowy w testowaniu jednostkowym).Powermockito doNothing dla metody z argumentami

Mam klasy o nazwie zasobu, który ma metodę statyczną o nazwie readResources:

public static void readResources(ResourcesElement resourcesElement); 

ResourcesElement również zakodowany przeze mnie. Podczas testowania chcę utworzyć własny zasób, więc chcę, aby powyższa metoda nie działała. że próbuje przy użyciu tego kodu:

PowerMockito.spy(Resource.class); 
    PowerMockito.doNothing().when(Resource.class, "readResources", Matchers.any(ResourcesElement.class)); 

Test jednostki wyjątek to wykryty tutaj niewykończone Stubbing::

org.mockito.exceptions.misusing.UnfinishedStubbingException -> w org.powermock .api.mockito.internal.PowerMockitoCore.doAnswer (PowerMockitoCore.java:36)

Powermockito sugerują również, że należy używać thenReturn lub thenThrow po kiedy, ale wydaje się, że metoda "when" zwraca pustkę, gdy zostanie wywołana po doNothing (co jest logiczne). Gdy próbuję:

PowerMockito.when(Resource.class, "readResources", Matchers.any(ResourcesElement.class))..... 

DoNothing nie jest opcją, po kiedy.

Udało mi się stworzyć metody bez argumentów, aby nic nie robić, używając wersji 2 argumentów metody. Na przykład:

PowerMockito.doNothing().when(Moduler.class, "startProcessing"); 

To działa (startProcessing nie przyjmuje żadnych argumentów).

Ale jak mogę stworzyć metody, które podejmują argumenty, aby nie robić nic z Powermockito?

Odpowiedz

13

Możesz znaleźć poniżej w pełni funkcjonalny przykład. Ponieważ nie opublikowałeś całego przykładu, mogę tylko założyć, że nie zanotowałeś klasy testowej z @RunWith lub @PrepareForTest, ponieważ reszta wydaje się w porządku.

@RunWith(PowerMockRunner.class) 
@PrepareForTest({Resource.class}) 
public class MockingTest{ 

    @Test 
    public void shouldMockVoidStaticMethod() throws Exception { 
     PowerMockito.spy(Resource.class); 
     PowerMockito.doNothing().when(Resource.class, "readResources", Mockito.any(String.class)); 

     //no exception heeeeere! 
     Resource.readResources("whatever"); 

     PowerMockito.verifyStatic(); 
     Resource.readResources("whatever"); 
    } 

} 

class Resource { 
    public static void readResources(String someArgument) { 
     throw new UnsupportedOperationException("meh!"); 
    } 
} 
+0

Dzięki, to było to, zapomniałem dodać adnotacji przy @PrepareForTest (mój drugi przykład działał, ponieważ tam pamiętałem, aby go opisywać). – Anakin001

+0

Nie ma problemu, przydarzyło mi się kilka razy i straciłem kilka godzin próbując to rozgryźć – Morfic

+0

@ Anakin001: Co jeśli metoda ** readResources ** jest w tym przypadku prywatna i niestatyczna? –

0

Może nie mogę undestand pytanie, ale wierzę, że to konieczne, określić, co należy zrobić metoda, więc jeśli nie podasz thenReturn lub thenThrow lub cokolwiek powerMockito nie wie, co ma robić, kiedy czytać swoje prawdziwy kod, na przykład:

prawdziwy kod:

  IPager pag; 
     IPagerData<List<IDeute>> dpag; 
     pag = new PagerImpl(); 
     pag.setFiles(nombrefilesPaginador); 
     pag.setInici(1); 
     dpag = gptService.obtenirDeutes(idSubjecte, idEns, tipusDeute, periode, pag); 

Testowanie prawdziwy kod przez Mockito:

 IPager pag = new PagerImpl(); 
     pag.setInici(1); 
     pag.setFiles(0); 
     when(serveiGpt.obtenirDeutes(eq(331225L), 
     eq(IConstantsIdentificadors.ID_ENS_BASE), 
     Matchers.any(ETipusDeute.class), 
     Matchers.any(EPeriodeDeute.class), 
     eq(pag))) 
     .thenThrow(new NullPointerException(" Null!")); 

Jeśli nie masz określ powrót, mój test się nie powiedzie. Mam nadzieję, że to pomaga.

+1

Dzięki za odpowiedź. Nie mogę zwrócić niczego, ponieważ moja metoda zwraca nieważne. Ponadto nie chcę zgłaszać wyjątku. Po prostu chcę, żeby ta metoda nic nie robiła. – Anakin001

1

Jeśli doNothing() nie działa można go siekać trochę używając PowerMockito.doAnswer(). Pozwala to na wyśmiewanie się z nieważnych metod, które mają coś zrobić, np. Ustawianie wartości itp. Jeśli funkcja doNothing() nie działa, użycie pustego kodu powinno działać poprawnie.

Przykład:

PowerMockito.doAnswer(new org.mockito.stubbing.Answer<Object>() { 
    @Override 
    public Object answer(InvocationOnMock invocation) throws Throwable { 
     return null; //does nothing 
    } 
}).when(mockObject).methodYouWantToDoNothing(args); 
+1

To działa, dziękuję, ale problem polegał na tym, że zapomniałem dodać adnotacji do @PrepareForTest, jak sugerował Grove. Niemniej jednak, świetna odpowiedź i będę o tym pamiętać na przyszłość (nie wiedziałem o DoAnswer). – Anakin001

1

Dlaczego przejść przez tyle kłopotów po prostu tak, że metoda ta nie robi nic. Po prostu wywołanie PowerMockito.mockStatic(Resource.class) powinno zastąpić wszystkie statyczne metody w twojej klasie domyślnymi skrótami, które w zasadzie oznaczają, że nic nie robią.

Chyba że chcesz zmienić zachowanie metody, aby rzeczywiście zrobić coś, wystarczy zadzwonić pod numer PowerMockito.mockStatic(Resource.class). Oczywiście oznacza to również, że wszystkie statyczne metody w klasie są zgaszone, co należy wziąć pod uwagę.

Powiązane problemy