Mockito Argument Captor Nedir? Nerede Kullanırız? — Java

Mehmet Demircan
2 min readJan 3, 2020

--

Merhaba arkadaşlar,

Bugün sizlere bildiğim kadarıyla Mockito’nun Argument Captor sınıfını anlatacağım. Argument Captor, bulunduğumuz classtan farklı classların metodlarına aktarılan objeyi yakalamak amacıyla kullanılır. Böylece argümanlar için verify veya assertlerimizi yazabiliriz.

Örnek olarak düşünürsek servisimizde çağrılan metod içerisinde parametre veya parametreler üretip bu parametreler ile yeni bir obje oluşturduğumuzda bu objeyi başka bir classın metoduna aktardığımızı varsayalım, aktardığımız objeyi direkt olarak verify edebilir veya assert gerçekleştirebiliriz.

Örnek Kullanım:

Servis classımızda örnek bir obje ürettik ve bu obje ile farklı bir sınıf olan Repository’deki save metodunu çağırdık.

//Service
private final CustomerRepository customerRepository;

public CustomerService(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}

public void createCustomer() {
final Customer customer = new Customer();
customer.setFirstName("Mehmet");
customer.setLastName("Demircan");

customerRepository.save(customer);
}

İşte tam olarak ArgumentCaptor bu ve benzeri durumlarda devreye girer, aşağıdaki örneğimizde save metodunu hangi obje ile çağırdığımızı yakalayabiliyoruz ve böylece sorunsuz şekilde verify ve assert işlemi gerçekleştirebiliyoruz.

@InjectMocks
private CustomerService customerService;
@Mock
private CustomerRepository customerRepository;
@Test
public void it_should_create_customer() {
// When
customerService.createCustomer();

// Then
ArgumentCaptor<Customer> argumentCaptor = ArgumentCaptor.forClass(Customer.class);

verify(customerRepository).save(argumentCaptor.capture());
Customer value = argumentCaptor.getValue();
assertThat(value.getFirstName()).isEqualTo("Mehmet");
assertThat(value.getLastName()).isEqualTo("Demircan");
}

Bu yazımızda nasıl argüman yakalayabileceğimizi inceledik, bildiklerimi olabildiğince anlatmaya çalıştım. Umarım faydalı olmuştur. Ek olarak;

Neden Argument Captor kullanmak önerilmiyor?
Yukarıdaki örneğimiz anlaşılabilir olması açısından yazılmıştır. Normal şartlarda bir objeyi set edip direkt o obje ile başka bir class çağrılmamalı set edilen obje başka bir classtan return edilmelidir. Argument Captor, çıkmaza girdiğimiz ve dönüşünde eforu büyük veya yazılmış bir kodun testi yoksa testi yazıp geçirebilmek amacıyla kullanılır. Mevcut yeni yazılmış kod için test aşamasında Argument Captor gereksinimi duyuyorsak aslında akışı doğru dizayn edememiş ve refactor edilmesi gereken bir kod yazmış oluyoruz. Bu sebepten dolayı Argument Captor kullanacağımızı farkettiğimizde kodumuzda eksiklik aramalıyız. :)

--

--