6.1 Håna den statiska metoden mockStatic()

Och ytterligare en viktig punkt är hån och verifiering av statiska metoder. "Vad är det för fel med det?" frågar du. Ja, statiskt, men metoderna är desamma. Och du kommer att ha fel.

Kommer du ihåg var vi började lära oss om skenobjekt? Eftersom dessa objekt är artificiellt skapade genom DynamicProxy. Och statiska metoder är inte bundna till några objekt och DynamicProxydet är omöjligt att avlyssna anrop till dem genom . Det är allt.

Men skaparna av Mockito kunde undvika även här - de skrev sin egen klasslastare och med dess hjälp kunde de byta ut klasser i farten. Ett stort och svårt jobb, men de lyckades ändå göra det.

Du måste lägga till ett extra bibliotek till pom.xml:

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

Så här fungerar du om du behöver håna en statisk metod.

1 Skapa ett speciellt mock-klassobjekt:

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

2 Lägg till operationsregler till det här objektet:

Till detta syfte med regeln är det nödvändigt att hålla fast vid andra sätt.

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

3 Se till att linda in användningen av detta objekttry-with-resources så att objektet omedelbart raderas och Mockito kan rensa reglerna som är kopplade till det.

Exempel:

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

Inte lika vackert som med anteckningar @Mockoch @Spy, men väldigt praktiskt. Det var väldigt svårt att skriva tester när det var omöjligt att håna en enkel statisk metod som användes i metoderna som testades.