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.
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.
-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.
-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