๐ Tempo di lettura: 2 minuti
Questa volta niente WebFlux: una pillola semplice per chi scrive (o dovrebbe scrivere) test in Java. Quindi, sรฌ, praticamente tutti!
Hai mai voluto verificare cosa viene effettivamente passato a un metodo mockato? Non se รจ stato chiamato โ quello lo fa verify() โ ma con quale oggetto, con quali dati?
๐ L'esempio
Nello snippet qui sotto ho usato ArgumentCaptor (lib. Mockito) per intercettare l'oggetto passato a un metodo save(...) su un mock. ร uno strumento utile per quei casi in cui vuoi ispezionare il contenuto reale degli oggetti che transitano, appunto, nei tuoi metodi mockati.
@SuppressWarnings("squid:S3577")
class SampleTest016 {
@Getter
@AllArgsConstructor
private static class Car {
private String model;
private int year;
}
private interface CarRepository {
void save(final Car car);
}
@AllArgsConstructor
private static class CarService {
private CarRepository repository;
public void addNewModel(final String model, final int year) {
repository.save(new Car(model, year));
}
}
@Test
void test_addNewModel_savesCarWithCorrectData() {
final CarRepository carRepository = mock(CarRepository.class);
final CarService carService = new CarService(carRepository);
//build a captor to catch Car instances passed to the mock
final ArgumentCaptor<Car> captor = ArgumentCaptor.forClass(Car.class);
carService.addNewModel("Porsche 356A", 1956);
verify(carRepository, times(1)).save(captor.capture()); //capture the argument from the save() method
final Car savedCar = captor.getValue(); //fetch the captured Car object
assertEquals(1956, savedCar.getYear());
assertEquals("Porsche 356A", savedCar.getModel());
}
}
๐ Come funziona?
- prima si definisce un
ArgumentCaptor<T>passando tra< >il tipo da intercettare (es.ArgumentCaptor<Car>). Se il metodo mockato ha piรน parametri, puoi creare piรนArgumentCaptor, uno per ciascun tipo capture()intercetta l'argomento passato a un metodo mockatogetValue()ti restituisce quell'oggetto per verificarne i valori nelle tue asserzioni
๐ Perchรฉ e quando utilizzarlo?
Personalmente non lo vedo usare spesso, ma รจ un ottimo strumento quando vuoi verificare il contenuto effettivo di un oggetto passato ad un mock ed รจ altrettanto utile per testare effetti collaterali e interazioni indirette, ad esempio quando un metodo non restituisce nulla ma deve comunque inviare qualcosa a un altro componente!
Alla prossima pillola! โ