2012-03-06 25 views
43

Mam kilka metod statycznego wykorzystania w moim projekcie, niektóre z nich po prostu przekazać lub rzucić wyjątek. Istnieje wiele przykładów na temat tego, jak wyśmiać statyczną metodę, która ma typ zwrotu inny niż nieważny. Ale jak wyśmiać statyczną metodę, która zwraca pustkę, aby "doNothing()"?Jak wyśmiać statyczną metodę, która zwraca nieważne z PowerMock?

Non-void wersja używa tych linii kodów:

@PrepareForTest(StaticResource.class) 

...

PowerMockito.mockStatic(StaticResource.class); 

...

Mockito.when(StaticResource.getResource("string")).thenReturn("string"); 

Jednak jeżeli są stosowane do StaticResources zwracającej void, kompilacja będzie narzekać, że when(T) nie ma zastosowania dla nieważnych ...

Wszelkie pomysły?

Obejście prawdopodobnie spowodowałoby, że wszystkie statyczne metody zwróciłyby pewną liczbę Boolean, ale nie lubię takich rozwiązań.

Odpowiedz

25

Można to zrobić w taki sam sposób, jak w przypadku Mockito w rzeczywistych przypadkach. Na przykład można odcinki łańcucha następujący linia będzie miała pierwszą rozmowę zrobić nic, potem drugi i przyszłego wezwanie do getResources rzuci wyjątek:

// the stub of the static method 
doNothing().doThrow(Exception.class).when(StaticResource.class); 
StaticResource.getResource("string"); 

// the use of the mocked static code 
StaticResource.getResource("string"); // do nothing 
StaticResource.getResource("string"); // throw Exception 

Dzięki uwagą Matt Lachman, trzeba pamiętać, że jeśli domyślny Odpowiedź nie zmienia się w fałszywym czasie tworzenia, makieta domyślnie nic nie robi. Stąd napisanie następującego kodu jest równoznaczne z niezapisaniem go.

doNothing().doThrow(Exception.class).when(StaticResource.class); 
StaticResource.getResource("string"); 

Choć mówi się, że może to być interesujące dla kolegów, które będą odczytywane test, który nic dla tego konkretnego kodu spodziewać. Oczywiście można to dostosować w zależności od tego, jak jest postrzegana test.


Przy okazji, moim skromnym zdaniem powinieneś unikać kpienia z kodu statycznego, jeśli tworzysz nowy kod. W Mockito uważamy, że jest to zwykle wskazówka dla złego projektu, może to prowadzić do źle utrzymywalnego kodu. Chociaż istniejący dotychczasowy kod to kolejna historia.

Ogólnie rzecz biorąc, jeśli chcesz sfałszować metodę prywatną lub statyczną, ta metoda ma za dużo i powinna być uzewnętrzniona w obiekcie, który zostanie wstrzyknięty w badany obiekt.

Nadzieję, że pomaga.

Pozdrowienia

+1

niestety, że nie będzie działać jak w przypadku() przyjmuje tylko zmienną i StaticResource jest typem. ('StaticResource nie może być rozdzielone na zmienną') – Pete

+0

O tak, przepraszam, masz rację, mój kod jest zły, jestem przyzwyczajony do niesztampowych makiet. W każdym razie zaktualizowałem swój ansswer, aby odzwierciedlić poprawną składnię. – Brice

+0

Dzięki! Czy posiadanie statycznych metod pomocniczych, które nie mają zależności, jest złym pomysłem? Oczywiście mógłbym tylko wstrzyknąć i zgłosić obiekt, który wykonuje pracę, ale wydaje się, że ma sens umieszczanie pracowników, którzy nie mają zależności w statycznym obiekcie, dla oznaczenia ich niezależności .. – Pete

55

Można stub statyczne void metoda tak:

PowerMockito.doNothing().when(StaticResource.class, "getResource", anyString()); 

Chociaż nie jestem pewien, dlaczego nie przeszkadza, ponieważ podczas rozmowy mockStatic (StaticResource.klasa) wszystko statyczne metody StaticResource są domyślnie zgaszone

Bardziej użyteczne, można uchwycić wartości przekazanej StaticResource.getResource() tak:

ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); 
PowerMockito.doNothing().when(
       StaticResource.class, "getResource", captor.capture()); 

Następnie można ocenić, że ciąg został przekazany do StaticResource.getResource tak:

String resourceName = captor.getValue(); 
+0

Możliwość zrobienia tego jest całkiem fajna, ponieważ pozwala robić rzeczy takie jak kiwanie Thread.sleep (długie millis) do spania na inny czas/mniej czasu/nie ma czasu! – fragorl

+0

Czy istnieje sposób na uniknięcie używania łańcuchów dla metod - jak "getResource" w twoim przykładzie? –

8

Mówiąc prościej, Wyobraź sobie, jeśli chcesz makiety poniżej linii:

StaticClass.method(); 

czym piszesz poniżej linii kodu do makiety:

PowerMockito.mockStatic(StaticClass.class); 
PowerMockito.doNothing().when(StaticClass.class); 
StaticClass.method(); 
1

mock statycznej metody, które zwracają na przykład void Fileutils.forceMKdir(File file),

Przykładowy kod:

File file =PowerMockito.mock(File.class); 
PowerMockito.doNothing().when(FileUtils.class,"forceMkdir",file); 
Powiązane problemy