@ActiveProfiles("test")
// DB 연결 정보
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=test
spring.datasource.password=password
spring.h2.console.enabled=true
// test에서 사용할 secretkey 값
jwt.secret.key=~~~
assertNotNull(token);
var
claims
@WebMvcTest(테스트 할 대상이 되는 컨트롤)
@WebMvcTest(TodoController.class)
스프링MVC 웹 관련 설정들을 넣어주게 됨
웹MVC 사용하려면 MockMvcBuilders 필수적으로 사용해줘야함
setUp()
: setUp을 통해서 실제 유저 정보를 DB에 저장해줌
@BeforeEach
void setUp() {
mockMvc = MockMvcBuilders
.webAppContextSetup(context) // 기본적으로 context 정보를 Setup해줘야함
.build(); // 이까지는 필수로 넣어줘야 하는 부분
// 주입할 유저 정보를 만들어 주는 부분
// Mock 테스트 UserDetails 생성
UserDetailsImpl testUserDetails = new UserDetailsImpl(TEST_USER);
// SecurityContext 에 인증된 사용자 설정
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(
testUserDetails, testUserDetails.getPassword(), testUserDetails.getAuthorities()));
}
.builder
TodoRequestDTO TEST_TODO_REQUEST_DTO = TodoRequestDTO.builder()
.title(TEST_TODO_TITLE)
.content(TEST_TODO_CONTENT)
.build();
mockMvc.perform
perform 메서드를 통해 해당 메서드(빌더 패턴의 요청 정보)와 그 메서드에 해당하는 Url을 넣어줌
var action = mockMvc.perform(post("/api/todos")
실제 웹 호출이 발생하는 것 처럼 동작하게 해줌
Pathparam도 가능!
var action = mockMvc.perform(get("/api/todos/{todoId}", TEST_TODO_ID)
// when
var action = mockMvc.perform(post("/api/todos") // 2. perform(호출)하게되면 -> 3. 응답값을 확인할 수 있는 action이 변수로 나옴
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON) // 1. 얘를 요청 Body에 넣어서
.content(objectMapper.writeValueAsString(TEST_TODO_REQUEST_DTO)));
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(TEST_TODO_REQUEST_DTO))
action.andExpect()
// then
action.andExpect(status().isCreated());
verify(todoService, times(1)).createTodo(any(TodoRequestDTO.class), eq(TEST_USER));
// then
action
.andExpect(status().isOk())
.andExpect(jsonPath("$.title").value(TEST_TODO_TITLE))
.andExpect(jsonPath("$.content").value(TEST_TODO_CONTENT));
ReflectionTestUtils
ReflectionTestUtils.setField(newTodo, Todo.class, "id", id, Long.class);
newTodo
: 어떤 객체(필드)를 값을 넣어줄거고,Todo.class
: 걔는 어떤 클래스고,"id"
: 클래스에 어떤 필드를 넣어줄 것이며,id
: 그 값Long.class
그 값의 타입SerializationUtils
var newTodo = SerializationUtils.clone(todo);
public class Todo implements Serializable
jsonPath($[?(조건식)])
// then
action
.andExpect(status().isOk())
.andExpect(jsonPath("$[?(@.user.username=='" + TEST_USER.getUsername() + "')].todoList[*].id")
.value(Matchers.containsInAnyOrder(testTodo1.getId().intValue(), testTodo2.getId().intValue())))
.andExpect(jsonPath("$[?(@.user.username=='" + TEST_ANOTHER_USER.getUsername() + "')].todoList[*].id")
.value(Matchers.containsInAnyOrder(testAnotherTodo.getId().intValue())));
verify(todoService, times(1)).getUserTodoMap();
.andExpect(jsonPath("$[?(@.user.username=='" + TEST_USER.getUsername() + "')].todoList[*].id")
@
.todoList[*]
.id
.value(Matchers.containsInAnyOrder(testTodo1.getId().intValue(), testTodo2.getId().intValue())))
.value
Matchers.containsInAnyOrder(내가 원하는 값)
@ExtendWith(MockitoExtension.class)
@InjectMocks
@InjectMocks
TodoService todoService;
@EqualsAndHashCode(callSuper = false)
(callSuper = false)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)