Java >> Java tutorial >  >> Tag >> static

Hvorfor håner Mockito ikke statiske metoder?

Jeg tror, ​​årsagen kan være, at mock-objektbiblioteker typisk laver mocks ved dynamisk at skabe klasser under kørsel (ved hjælp af cglib). Det betyder, at de enten implementerer en grænseflade ved runtime (det er det, EasyMock gør, hvis jeg ikke tager fejl), eller de arver fra klassen for at håne (det er, hvad Mockito gør, hvis jeg ikke tager fejl). Begge tilgange virker ikke for statiske medlemmer, da du ikke kan tilsidesætte dem ved hjælp af arv.

Den eneste måde at håne statik på er at modificere en klasses bytekode ved kørsel, som jeg formoder er lidt mere involveret end arv.

Det er mit gæt på det, for hvad det er værd...


Hvis du har brug for at håne en statisk metode, er det en stærk indikator for et dårligt design. Normalt håner du afhængigheden af ​​din klasse-under-test. Hvis din klasse-under-test refererer til en statisk metode - som java.util.Math#sin for eksempel - betyder det, at klassen-under-test har brug for præcis denne implementering (af nøjagtighed vs. hastighed for eksempel). Hvis du vil abstrahere fra en konkret sinus-implementering, har du sandsynligvis brug for en grænseflade (kan du se, hvor dette vil hen)?


Mockito [3.4.0] kan håne statiske metoder!

  1. Erstat mockito-core afhængighed med mockito-inline:3.4.0 .

  2. Klasse med statisk metode:

    class Buddy {
      static String name() {
        return "John";
      }
    }
    
  3. Brug den nye metode Mockito.mockStatic() :

    @Test
    void lookMomICanMockStaticMethods() {
      assertThat(Buddy.name()).isEqualTo("John");
    
      try (MockedStatic<Buddy> theMock = Mockito.mockStatic(Buddy.class)) {
        theMock.when(Buddy::name).thenReturn("Rafael");
        assertThat(Buddy.name()).isEqualTo("Rafael");
      }
    
      assertThat(Buddy.name()).isEqualTo("John");
    }
    

    Mockito erstatter den statiske metode i try kun blokere.


Java tag