Als ich neulich etwas über Unit-Tests erfuhr, wollte ich manchmal die Argumente überprüfen, die an eine bestimmte Methode übergeben wurden, und ich habe damals ArgumentCaptor verwendet, also werde ich einen Artikel schreiben.
Während eines Komponententests möchten Sie beispielsweise überprüfen, ob eine stubifizierte Methode ordnungsgemäß aufgerufen wurde oder ob Argumente für diese Methode ordnungsgemäß übergeben wurden. Dann habe ich ArgumentCaptor verwendet.
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);
}
}
}
・ Diese Klasse wurde ein wenig in "Zusammenfassung dessen, was ich in Spring Batch gelernt habe" eingeführt, und ich habe die Writer-Klasse implementiert. -Es ist ein einfacher Vorgang zum Registrieren der Liste der als Parameter übergebenen Objekte in der Datenbank mithilfe der Serviceklasse. -In diesem Test wird diese Klasse getestet, und zu diesem Zeitpunkt ist PersonService noch nicht abgeschlossen, sodass sie verspottet ist.
PersonService.java
public interface PersonService {
//Prozess zur Registrierung in der Datenbank
public void updatePerson(Person person);
}
・ Das Folgende ist eine Testklasse.
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);
}
//Ausführung des Testziels
writer.write(people);
verify(personService, times(3)).updatePerson(personCaptor.capture());
Person person = personCaptor.getValue();
assertThat(person, is(people.get(people.size() - 1)));
}
}
-Person Service wird mit Mock Annotation verspottet (Informationen zur Verwendung von Mockito finden Sie auf der unter "Referenz" beschriebenen Site).
-Ich denke, es gibt möglicherweise mehrere Argumente für die Methode, die Sie überprüfen möchten, ob sie ausgeführt wurde.
PersonService.java
public interface PersonService {
public void updatePersonById(int id, String lastName, String firstName);
}
-PersonItemWriter verwendet PersonService wie folgt.
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());
}
}
}
-Wenn Sie das an PersonService.updatePersonById () übergebene Argument beim Überprüfen von PersonItemWriter.write () überprüfen möchten, schreiben Sie den Test wie folgt.
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);
}
//Ausführung des Testziels
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()));
}
}
Damit ist die Erläuterung zum Überprüfen von Argumenten mit ArgumentCaptor abgeschlossen.
Referenz: [Überprüfung der Argumente durch ArgumentCaptor](Überprüfung der Argumente durch https://riptutorial.com/ja/mockito/example/16192/argumentcaptor) Beginn von Mockito Verwendung der Überprüfung der Junit-Bibliothek "Mockito" Zu komfortable Scheinbibliothek Mockito ~ Teil 1 ~ JUnit Memorandum