[JAVA] Überprüfen Sie Argumente mit ArgumentCaptor mit mockito

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.

Überblick

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.

Wenn die Anzahl der Argumente eins ist

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

Wenn es mehrere Argumente gibt

-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

Recommended Posts

Überprüfen Sie Argumente mit ArgumentCaptor mit mockito
Verwenden von Java mit AWS Lambda-Implementation-Check CloudWatch-Argumenten
Verwenden Sie Pair mit OpenJDK
Vorsichtsmaßnahmen bei der Verwendung von Mockito.anyString als Argument beim Verspotten mit Mockito
Versuchen Sie es mit GloVe mit Deeplearning4j
Japanisieren Sie mit i18n mit Rails
Verwenden von Mapper mit Java (Spring)
Überprüfen Sie die Pfadparameter mit @RequestMapping
Verwenden von PlantUml mit Honkit [Docker]
Java Unit Test mit Mockito