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 DynamicProxy
imkansı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());
}
}
@Mock
Ek 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.