6.1 Batjocorirea metodei statice mockStatic()
Și încă un punct important este batjocorirea și verificarea metodelor statice. „Ce e în neregulă cu asta?” întrebi. Da, statice, dar metodele sunt aceleași. Și vei greși.
Îți amintești de unde am început să învățăm despre obiectele simulate? Deoarece aceste obiecte sunt create artificial prin intermediul DynamicProxy
. Și metodele statice nu sunt legate de niciun obiect și DynamicProxy
este imposibil să interceptați apelurile către ele prin . Asta e tot.
Dar creatorii lui Mockito au putut să se eschiveze și aici - și-au scris propriul încărcător de clasă și, cu ajutorul lui, au reușit să înlocuiască cursurile din mers. O treabă mare și grea, dar totuși au reușit să o facă.
Va trebui să adăugați o bibliotecă suplimentară la pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
Iată cum să lucrezi dacă trebuie să batjocorești o metodă statică.
1 Creați un obiect special de clasă simulată:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 Adăugați reguli de operare la acest obiect:
De acest obiect al regulii este necesar să ne agăți în alte moduri.
managerObject.when(ClassName::method name).thenReturn(result);
3 Asigurați-vă că includeți utilizarea acestui obiect astfeltry-with-resources
încât obiectul să fie șters imediat și Mockito să poată șterge regulile asociate cu acesta.
Exemplu:
@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());
}
}
Nu la fel de frumos ca cu adnotările @Mock
și @Spy
, dar foarte practic. A fost foarte dificil să scrieți teste când era imposibil să batem joc de o metodă statică simplă care a fost folosită în cadrul metodelor testate.
GO TO FULL VERSION