๐Ÿ• 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?

๐Ÿ“Œ 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! โ˜•