6.1 mockStatic() statik yöntemiyle alay etme

Ve bir diğer önemli nokta, statik yöntemlerin alay edilmesi ve doğrulanmasıdır. “Bunun nesi var?” diye soruyorsunuz. Evet, statik, ancak yöntemler aynı. Ve yanılacaksın.

Sahte nesneleri nerede öğrenmeye başladığımızı hatırlıyor musunuz? Bu nesneler yapay olarak DynamicProxy. Ve statik yöntemler herhangi bir nesneye bağlı değildir ve onlara yapılan çağrıları durdurmak DynamicProxyimkansızdır . Bu kadar.

Ancak Mockito'nun yaratıcıları burada da kaçmayı başardılar - kendi sınıf yükleyicilerini yazdılar ve onun yardımıyla sınıfları anında değiştirebildiler. Büyük ve zor bir iş, ama yine de yapmayı başardılar.

Ek bir kitaplık eklemeniz gerekecek pom.xml:

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

Statik bir yöntemle alay etmeniz gerekirse, nasıl çalışacağınız aşağıda açıklanmıştır.

1 Özel bir sahte sınıf nesnesi oluşturun:

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

2 Bu nesneye işlem kuralları ekleyin:

Kuralın bu amacına başka şekillerde sarılmak gerekir.

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

3 Nesnenin hemen silinmesi ve Mockito'nun onunla ilişkili kuralları silebilmesi için bu nesnenin kullanımını paketlediğinizdentry-with-resources emin olun .

Örnek:

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

@MockEk açıklamalar ve ile olduğu kadar güzel değil @Spy, ama çok pratik. Test edilen yöntemlerin içinde kullanılan basit bir statik yöntemle alay etmek imkansızken test yazmak çok zordu.