며칠전에 작성하다 말았던 테스트 코드를 다시 작성해보았는데, 생각이 안나서 (?) 계속 예제를 참고하며 코딩했다. 
이번에 새로 깨달은 점은 @MockBean을 하는 경우이다. 임시 객체만 생성하고 원하는 값을 주입하고자 할 때 사용하는 것이구나 싶다. 그리고 테스트 케이스도 정석으로 잘되는 동작, 정석이 아닌 경우에도 잘 되는 동작, 에러나는 동작 등 코드의 전체 브랜치를 확인할 수 있게 작성해야 하는 것도 배웠다. 내일은 다른 Controller에 대해 훝어보고, 서비스 코드에서의 테스트 코드는 어떻게 짜는 것인지 공부해보도록 하자. 

package org.springframework.samples.petclinic.owner;

import org.assertj.core.util.Lists;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.test.web.servlet.MockMvc;

import java.time.LocalDate;


import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

@WebMvcTest(OwnerController.class)
public class OwnerControllerTests2 {
	@Autowired
	MockMvc mockMvc;

	@MockBean
	OwnerRepository owners;

	private static final int TEST_OWNER_ID = 1;

	private Owner george() {
		Owner george = new Owner();
		george.setId(TEST_OWNER_ID);
		george.setFirstName("George");
		george.setLastName("Franklin");
		george.setAddress("110 W. Liberty St.");
		george.setCity("Madison");
		george.setTelephone("6085551023");
		Pet max = new Pet();
		PetType dog = new PetType();
		dog.setName("dog");
		max.setType(dog);
		max.setName("Max");
		max.setBirthDate(LocalDate.now());
		george.addPet(max);
		max.setId(1);
		return george;
	};

	@BeforeEach
	void setup() {
		given(this.owners.findByLastName(eq("George"), any(Pageable.class)))
			.willReturn(new PageImpl<Owner>(Lists.newArrayList(george())));

		given(this.owners.findByLastName(eq("Franklin"), any(Pageable.class)))
			.willReturn(new PageImpl<Owner>(Lists.newArrayList(george())));

		given(owners.findByFullName(any(), any(), any(Pageable.class))).willReturn(
			new PageImpl<Owner>(Lists.newArrayList(george()))
		);
		given(owners.findById(TEST_OWNER_ID)).willReturn(
			george()
		);
	}

	@Test
	void testGetOwnerSuccess() throws Exception {
		mockMvc.perform(
			get("/owners")
		).andExpect(status().is3xxRedirection())
			.andExpect(view().name("redirect:/owners/1"));
	}

	@Test
	void testGetOwnersSuccess() throws Exception {
		Mockito.when(this.owners.findByFullName(any(), any(), any(Pageable.class))).thenReturn(
			new PageImpl<Owner>(Lists.newArrayList(george(), george()))
		);

		mockMvc.perform(
			get("/owners")
		).andExpect(status().isOk())
			.andExpect(view().name("owners/ownersList"));
	}
}

+ Recent posts