Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar
Yöntem bağımsız değişkenlerini ArgumentCaptor ile yakalayın ve gerçek nesneleri Mockito.spy ile kısmen taklit edin.
Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
ArgumentCaptor: Yöntem Argümanlarını Yakalama
ArgumentCaptor, taklit edilen bir yönteme aktarılan argümanları yakalayarak bunları doğrulamanızı sağlar. Argüman sınanan sistemin içinde oluşturulduğunda ve ona doğrudan erişemediğinizde kullanışlıdır.
ArgumentCaptor Oluşturma ve Kullanma
Argüman türü için bir captor oluşturun, verify() içinde argüman eşleştirici olarak captor.capture() aktarın, ardından yakalanan argümanı almak için captor.getValue() çağrısını yapın.
@Test
void sends_correct_email() {
ArgumentCaptor<EmailMessage> captor = ArgumentCaptor.forClass(EmailMessage.class);
userService.register(new CreateUserRequest("alice@example.com"));
verify(emailService).send(captor.capture());
EmailMessage msg = captor.getValue();
assertEquals("alice@example.com", msg.getTo());
assertTrue(msg.getSubject().contains("Welcome"));
}@Captor Ek Açıklaması
Gereksiz ArgumentCaptor.forClass() çağrılarından kaçınmak için @Captor ek açıklamasını @ExtendWith(MockitoExtension.class) ile kullanın.
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock EmailService emailService;
@Captor ArgumentCaptor<EmailMessage> emailCaptor;
@Test
void captures_email() {
// ...
verify(emailService).send(emailCaptor.capture());
assertEquals("Welcome!", emailCaptor.getValue().getSubject());
}
}Birden Çok Çağrıyı Yakalama
Yöntem birden çok kez çağrıldığında captor.getAllValues() kullanın. Tüm yakalanan değerlerin bir listesini çağrı sırasıyla döndürür.
verify(emailService, times(3)).send(emailCaptor.capture());
List<EmailMessage> messages = emailCaptor.getAllValues();
assertEquals(3, messages.size());
assertEquals("Confirmation", messages.get(0).getSubject());Mockito Spy'ları: Kısmi Taklit
Mockito.spy(), gerçek bir nesneyi sarar. Açıkça sahte davranış tanımlamadığınız sürece tüm yöntemler normal şekilde çalışır. Sınanması zor bazı bağımlılıkları olan ancak çoğunlukla çalışan bir sınıfı sınamanız gerektiğinde kullanın.
List<String> realList = new ArrayList<>();
List<String> spy = Mockito.spy(realList);
spy.add("hello"); // calls real ArrayList.add()
System.out.println(spy.size()); // 1 — real method called
doReturn(42).when(spy).size(); // stub just size()
System.out.println(spy.size()); // 42 — stubbed@Spy Ek Açıklaması
Spy'lar oluşturmak için @Spy ek açıklamasını @ExtendWith(MockitoExtension.class) ile kullanın. Alan başlatılmış olmalıdır (satır içinde veya @Spy UserService svc = new UserService(repo); aracılığıyla).
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {
@Spy
OrderService orderService = new OrderService(mockRepo, mockEmail);
}@SpyBean ile Spring Bileşenlerini Spy'lama
Spring Boot sınamalarında @SpyBean, mevcut bir Spring bileşenini Mockito spy'ı ile sarar; sahte davranış tanımlanmadığı sürece gerçek davranış korunur. @SpringBootTest ile birlikte kullanılır.
@SpringBootTest
class IntegrationTest {
@SpyBean EmailService emailService;
@Test
void order_sends_email() {
orderService.placeOrder(cart);
verify(emailService).sendConfirmation(any());
}
}Spy'lar için doReturn ve when().thenReturn() Karşılaştırması
Spy'lar için when(spy.method()).thenReturn(value) yerine doReturn(value).when(spy).method() kullanın. when(spy.method()) biçimi gerçek yöntemi gerçekten çağırır ve bu da yan etkilere yol açabilir.
// Correct for spies:
doReturn(List.of()).when(spy).findAll();
// WRONG for spies — calls real findAll() first:
when(spy.findAll()).thenReturn(List.of()); // real method called!Etkileşim Olmadığını Doğrulama
Bir mock'un hiç çağrılmadığını doğrulamak için verifyNoInteractions(mock) kullanın. Beklenen tüm çağrılardan sonra beklenmeyen çağrıları yakalamak için verifyNoMoreInteractions(mock) kullanın.
verifyNoInteractions(emailService); // never called
verify(repo).save(any());
verifyNoMoreInteractions(repo); // save() was the only interactionInOrder ile Doğrulama
Taklit edilen yöntemlerin belirli bir sırayla çağrıldığını doğrulamak için InOrder kullanın.
InOrder inOrder = inOrder(repo, emailService);
inOrder.verify(repo).save(any());
inOrder.verify(emailService).send(any()); // save happened BEFORE sendArgüman Eşleştiricileri
Captor'ları eşleştiricilerle birleştirin: any(), eq(), anyString(), argThat(predicate). Herhangi bir argüman eşleştirici kullanıyorsa tüm argümanlar eşleştirici kullanmalıdır.
verify(repo).save(argThat(user ->
user.getEmail().endsWith("@example.com") &&
user.getStatus() == UserStatus.ACTIVE));Kısa Kontrol
Bir spy'ın davranışını tanımlarken neden when().thenReturn() yerine doReturn kullanılır?
Özet
ArgumentCaptor, çağrıdan sonra doğrulama yapabilmeniz için argümanları yakalar. Spy'lar gerçek nesneleri sarar ve sahte davranış tanımlanmadığı sürece çağrıları gerçek nesneye aktarır. Spy'lar için doReturn kullanın. Spring entegrasyon sınamaları için @SpyBean kullanın. Çağrı sırasını InOrder ile doğrulayın.
Sıkça Sorulan Sorular
“Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar” dersi ücretsiz mi?
Evet — “Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar” dersinde ne öğreneceğim?
Yöntem bağımsız değişkenlerini ArgumentCaptor ile yakalayın ve gerçek nesneleri Mockito.spy ile kısmen taklit edin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- @CsvSource ve @MethodSource ile Parametreli Testler
- Mockito İleri Düzey: Bağımsız Değişken Yakalayıcıları ve Casuslar
- Spring Boot Test Dilimleri: @WebMvcTest ve @DataJpaTest
- Testcontainers: Gerçek Veritabanı Tümleştirme Testleri