[JAVA] Valider les arguments à l'aide d'ArgumentCaptor avec mockito

L'autre jour, quand j'ai appris les tests unitaires, j'ai parfois voulu vérifier les arguments passés à une méthode, et j'ai utilisé ArgumentCaptor à ce moment-là, donc j'écrirai un article.

Aperçu

Lors d'un test unitaire, par exemple, vous souhaiterez peut-être vérifier qu'une méthode stubifiée a été appelée correctement ou que les arguments ont été transmis correctement pour cette méthode. C'est à ce moment-là que j'ai utilisé ArgumentCaptor.

Quand le nombre d'arguments est un

-Décrivez d'abord le cas où un argument est passé à la méthode de l'objet simulé. ・ Tout d'abord, je vais décrire la classe à tester.

PersonItemWriter.java


public class PersonItemWriter implements ItemWriter<Object>{

	@Autowired
	PersonService service;

	@Override
	public void write(List<? extends Object> items) throws Exception {
		for(Object person : items) {
			service.updatePerson((Person)person);
		}

	}

}

・ Cette classe a été introduite un peu dans "Résumé de ce que j'ai appris dans Spring Batch", et j'ai implémenté la classe Writer. -Il s'agit d'un processus simple d'enregistrement de la liste des objets passés en paramètres dans la base de données à l'aide de la classe de service. -Dans ce test, cette classe est testée, et à ce moment-là, PersonService n'est pas encore terminé, il est donc défini sur mock. -En supposant que le service de personne est le suivant.

PersonService.java


public interface PersonService {

	//Processus d'inscription dans la base de données
	public void updatePerson(Person person);

}

・ Ce qui suit est une classe de test.

PersonItemWriterTest.java


public class PersonItemWriterTest {

	@Mock
	PersonService personService;

	@InjectMocks
	private PersonItemWriter writer = new PersonItemWriter();

	@Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

	@Test
	public void testParameter() throws Exception {
		ArgumentCaptor<Person> personCaptor = ArgumentCaptor.forClass(Person.class);
		List<Person> people = new ArrayList<Person>();
		for(int i = 0; i < 3; i++) {
			Person person = new Person(i, "hoge" + i, "fuga" + i);
			people.add(person);
		}

		//Exécution de la cible de test
		writer.write(people);

		verify(personService, times(3)).updatePerson(personCaptor.capture());
		Person person = personCaptor.getValue();
		assertThat(person, is(people.get(people.size() - 1)));
	}


}

-Personne Service est simulé en utilisant l'annotation Mock (Pour savoir comment utiliser mockito, reportez-vous au site décrit dans "Référence"). -Préparer une instance d'ArgumentCaptor lors de la vérification des arguments. -Vous pouvez spécifier la classe lorsque vous créez une instance, mais dans ce cas, spécifiez la classe que le paramètre de la méthode que vous souhaitez tester peut prendre. -Dans ce test, je veux vérifier si PersonService.updatePerson () a été appelé correctement. -Par conséquent, la classe spécifiée pour ArgumentCaptor est Person. -La méthode qui vérifie si la méthode a été appelée est verify () de Mockito. -Pass ArgumentCaptor comme argument de la méthode spécifiée par verify. · Vérifiez si PersonItemWriter.write () a appelé PersonService.updatePerson () avec verify, et utilisez ArgumentCaptor.getValue () pour vérifier si l'argument était correct.

Lorsqu'il y a plusieurs arguments

-Je pense qu'il peut y avoir plusieurs arguments pour la méthode que vous voulez vérifier si elle a été exécutée. -Par exemple, lorsque la méthode PersonService est la suivante.

PersonService.java


public interface PersonService {

	public void updatePersonById(int id, String lastName, String firstName);

}

-PersonItemWriter utilise PersonService comme suit.

PersonItemWriter.java


public class PersonItemWriter implements ItemWriter<Object>{

	@Autowired
	PersonService service;

	@Override
	public void write(List<? extends Object> items) throws Exception {
		for(Object person : items) {
			service.updatePersonById(((Person) person).getId(), ((Person) person).getLastName(), ((Person) person).getFirstName());
		}

	}

}

-Si vous souhaitez vérifier l'argument passé à PersonService.updatePersonById () lors de la validation de PersonItemWriter.write (), écrivez le test comme suit.

PersonItemWriterTest.java


public class PersonItemWriterTest {

	@Mock
	PersonService personService;

	@InjectMocks
	private PersonItemWriter writer = new PersonItemWriter();

	@Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

	@Test
	public void testParameter() throws Exception {
		ArgumentCaptor<Integer> idCaptor = ArgumentCaptor.forClass(Integer.class);
		ArgumentCaptor<String> lastNameCaptor = ArgumentCaptor.forClass(String.class);
		ArgumentCaptor<String> firstNameCaptor = ArgumentCaptor.forClass(String.class);
		List<Person> people = new ArrayList<Person>();
		for(int i = 0; i < 3; i++) {
			Person person = new Person(i, "hoge" + i, "fuga" + i);
			people.add(person);
		}

		//Exécution de la cible de test
		writer.write(people);

		verify(personService, times(3)).updatePersonById(idCaptor.capture(), lastNameCaptor.capture(), firstNameCaptor.capture());
		Integer id = idCaptor.getValue();
		String lastName = lastNameCaptor.getValue();
		String firstName = firstNameCaptor.getValue();
		assertThat(id, is(people.get(people.size() - 1).getId()));
		assertThat(lastName, is(people.get(people.size() - 1).getLastName()));
		assertThat(firstName, is(people.get(people.size() - 1).getFirstName()));

	}
}

-Préparez plusieurs ArgumentCaptors pour plusieurs arguments. -Comme la classe définie dans ArgumentCaptor doit être une classe de "type référence", définissez une classe wrapper (ici, Integer pour int) si le type primitif est pris comme argument. -Comme dans le cas d'un seul argument, passez ArgumentCaptor.capture () à chaque argument en tant qu'argument lors de la vérification de la méthode avec verify (). -Enfin, la valeur est obtenue par getValue () à partir de chacun des trois ArgumentCaptors passés à l'argument, et la valeur passée à l'argument est vérifiée.

Ceci conclut l'explication de la façon de vérifier les arguments à l'aide d'ArgumentCaptor.

référence: [Vérification des arguments par ArgumentCaptor](Vérification des arguments par https://riptutorial.com/ja/mockito/example/16192/argumentcaptor) Début de Mockito Comment utiliser la vérification de la bibliothèque Junit "Mockito" Bibliothèque simulée trop confortable Mockito ~ Partie 1 ~ Mémorandum JUnit

Recommended Posts

Valider les arguments à l'aide d'ArgumentCaptor avec mockito
Utilisation de Java avec des arguments CloudWatch AWS Lambda-Implementation-Check
Utiliser la paire avec OpenJDK
Précautions lors de l'utilisation de Mockito.anyString comme argument lors de Mocking avec Mockito
Essayez d'utiliser GloVe avec Deeplearning4j
Japaneseize en utilisant i18n avec Rails
Utilisation de Mapper avec Java (Spring)
Validez les paramètres de chemin avec @RequestMapping
Utilisation de PlantUml avec Honkit [Docker]
Test unitaire Java avec Mockito