며칠전에 작성하다 말았던 테스트 코드를 다시 작성해보았는데, 생각이 안나서 (?) 계속 예제를 참고하며 코딩했다.
이번에 새로 깨달은 점은 @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"));
}
}
'Development > Spring' 카테고리의 다른 글
전시 데이터 수집 서비스 개발기 1 - 기능 및 일정 수립하기 (0) | 2024.03.17 |
---|---|
JPA 개념 이해 (0) | 2023.10.31 |