6.1 Håner den statiske metoden mockStatic()

Og et viktig poeng er hån og verifisering av statiske metoder. "Hva er galt med det?" spør du. Ja, statisk, men metodene er de samme. Og du vil ta feil.

Husker du hvor vi begynte å lære om falske gjenstander? Siden disse objektene er kunstig skapt gjennom DynamicProxy. Og statiske metoder er ikke bundet til noen objekter, og DynamicProxydet er umulig å avskjære anrop til dem gjennom . Det er alt.

Men skaperne av Mockito var i stand til å unnslippe her også - de skrev sin egen klasselaster og med dens hjelp kunne de erstatte klasser i farten. En stor og vanskelig jobb, men de klarte det likevel.

Du må legge til et ekstra bibliotek til pom.xml:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>4.2.0</version>
    <scope>test</scope>
</dependency>

Slik fungerer du hvis du trenger å håne en statisk metode.

1 Lag et spesielt mock klasseobjekt:

MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);

2 Legg til operasjonsregler til dette objektet:

Til dette formålet med regelen er det nødvendig å klamre seg til på andre måter.

managerObject.when(ClassName::method name).thenReturn(result);

3 Sørg for å pakke inn bruken av dette objektettry-with-resources slik at objektet blir slettet umiddelbart og Mockito kan slette reglene knyttet til det.

Eksempel:

@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());
    }
}

Ikke så vakkert som med merknader @Mockog @Spy, men veldig praktisk. Det var veldig vanskelig å skrive tester når det var umulig å håne en enkel statisk metode som ble brukt inne i metodene som ble testet.