6.1 Deridere il metodo statico mockStatic()
E un altro punto importante è la derisione e la verifica dei metodi statici. "Cosa c'è che non va?", chiedi. Sì, statico, ma i metodi sono gli stessi. E sbaglierai.
Ricordi dove abbiamo iniziato a conoscere gli oggetti fittizi? Poiché questi oggetti vengono creati artificialmente tramite DynamicProxy
. E i metodi statici non sono vincolati ad alcun oggetto ed DynamicProxy
è impossibile intercettare le chiamate ad essi tramite . È tutto.
Ma anche qui i creatori di Mockito sono stati in grado di schivare: hanno scritto il proprio caricatore di classi e con il suo aiuto sono stati in grado di sostituire le classi al volo. Un lavoro grande e difficile, ma sono comunque riusciti a farlo.
Sarà necessario aggiungere una libreria aggiuntiva a pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
Ecco come lavorare se devi prendere in giro un metodo statico.
1 Creare un oggetto di classe mock speciale:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 Aggiungere regole operative a questo oggetto:
A questo oggetto della regola è necessario aggrapparsi in altri modi.
managerObject.when(ClassName::method name).thenReturn(result);
3 Assicurati di racchiudere l'uso di questo oggetto intry-with-resources
modo che l'oggetto venga immediatamente eliminato e Mockito possa cancellare le regole ad esso associate.
Esempio:
@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());
}
}
Non bello come con annotazioni @Mock
e @Spy
, ma molto pratico. Era molto difficile scrivere test quando era impossibile deridere un semplice metodo statico utilizzato all'interno dei metodi sottoposti a test.
GO TO FULL VERSION