Jak wyśmiewać statyczną metodę zwracającą void za pomocą PowerMock?

Mam kilka statycznych metod util w moim projekcie, niektóre z nich po prostu przechodzą lub rzucają wyjątek. Istnieje wiele przykładów na to, jak wyśmiewać statyczną metodę, która ma typ powrotu inny niż void. Ale jak Mogę wyśmiewać statyczną metodę, która zwraca void do " doNothing()"?

Wersja non-void wykorzystuje te linie kodów:

@PrepareForTest(StaticResource.class)

...

PowerMockito.mockStatic(StaticResource.class);

...

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

Jeśli jednak zastosujemy do StaticResources, która zwraca void, kompilator będzie narzekał, że when(T) nie jest dotyczy unieważnienia...

Jakieś pomysły?

Obejściem prawdopodobnie byłoby po prostu, gdyby wszystkie metody statyczne zwróciły jakieś Boolean dla sukcesu, ale nie lubię obejść.

Author: ROMANIA_engineer, 2012-03-06

4 answers

Możesz to zrobić tak samo jak z Mockito na prawdziwych instancjach. Na przykład możesz łączyć stuby, następująca linia spowoduje, że pierwsze wywołanie nie zrobi nic, a drugie i przyszłe wywołanie getResources wyrzuci 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 uwagom Matta Lachmana, zauważ, że jeśli domyślna odpowiedź nie zostanie zmieniona w czasie tworzenia makiety, makieta domyślnie nic nie zrobi. Dlatego napisanie poniższego kodu jest równoznaczne z jego niepisaniem.

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

Choć to jest powiedział, że może być interesujące dla kolegów, którzy przeczytają test, że nie oczekujesz niczego dla tego konkretnego kodu. Oczywiście może to być dostosowane w zależności od tego, jak jest postrzegane zrozumiałość testu.


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

Ogólnie rzecz biorąc, jeśli trzeba wyśmiewać metodę prywatną lub statyczną, to ta metoda robi za dużo i powinna być uzewnętrzniona w obiekcie, który zostanie wstrzyknięty do testowanego obiektu.

Mam nadzieję, że to pomoże.

Pozdrawiam

 29
Author: Brice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 07:11:57

Możesz stub statyczna metoda void jak ta:

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

Chociaż nie jestem pewien, po co się kłopotać, ponieważ kiedy wywołujesz mockStatic (StaticResource.Klasa) Wszystkie statyczne metody w StaticResource są domyślnie stubbed

Bardziej przydatne, można uchwycić wartość przekazaną do StaticResource.getResource () like this:

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

Następnie możesz ocenić łańcuch, który został przekazany do StaticResource.getResource tak:

String resourceName = captor.getValue();
 64
Author: Justin Rowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-02 08:16:48

W prostszych słowach, Wyobraź sobie, że chcesz mocka poniżej linii:

StaticClass.method();

Następnie piszesz poniżej linie kodu, aby wyśmiewać:

PowerMockito.mockStatic(StaticClass.class);
PowerMockito.doNothing().when(StaticClass.class);
StaticClass.method();
 11
Author: Vivek HJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-04 12:30:54

Aby wyśmiewać statyczną metodę zwracającą void dla np. Fileutils.forceMKdir(File file),

Przykładowy kod:

File file =PowerMockito.mock(File.class);
PowerMockito.doNothing().when(FileUtils.class,"forceMkdir",file);
 3
Author: Oshin Talreja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 06:11:45