6.1 Wyśmiewanie metody statycznej mockStatic()
I jeszcze jeden ważny punkt to kpina i weryfikacja metod statycznych. „Co w tym złego?” – pytasz. Tak, statycznie, ale metody są takie same. I będziesz się mylił.
Pamiętasz, gdzie zaczęliśmy uczyć się o symulowanych obiektach? Ponieważ obiekty te są sztucznie tworzone przez DynamicProxy
. A metody statyczne nie są powiązane z żadnymi obiektami i DynamicProxy
niemożliwe jest przechwycenie wywołań do nich przez . To wszystko.
Ale i tu twórcy Mockito potrafili zrobić unik – napisali własny moduł ładujący klasy i z jego pomocą byli w stanie podmieniać klasy w locie. Duże i trudne zadanie, ale udało im się je wykonać.
Będziesz musiał dodać dodatkową bibliotekę do pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
Oto jak pracować, jeśli chcesz kpić z metody statycznej.
1 Utwórz specjalny próbny obiekt klasy:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 Dodaj zasady działania do tego obiektu:
Do tego przedmiotu reguły należy przylgnąć w inny sposób.
managerObject.when(ClassName::method name).thenReturn(result);
3 Pamiętaj , aby zawrzeć użycie tego obiektu,try-with-resources
aby obiekt został natychmiast usunięty, a Mockito mógł wyczyścić powiązane z nim reguły.
Przykład:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
Nie tak piękne jak z adnotacjami @Mock
i @Spy
, ale bardzo praktyczne. Bardzo trudno było pisać testy, gdy nie można było kpić z prostej metody statycznej, która była używana w testowanych metodach.
GO TO FULL VERSION