이전까지는 서비스 코드를 테스트하는 방법만 알았다.
테스트하는 방법에 대해 검색하던중, 컨트롤러 코드를 작성하는 방법이 있다는 것을 알게 되었다. 바로 MockMvc를 사용하는 것이다.
에러 발생
java.lang.AssertionError: Status expected:<200> but was:<500>
Expected :200
Actual :500
아래 코드를 적었지만 에러가 발생했다.
내가 예상하고 있는 에러는
1. jwtHeader = null
-> @WithAccount("creamyyyy")
를 적어줬음에도 왜 이렇지?
다음 코드를 추가해주었다.
@AfterEach
void afterEach() {
memberRepository.deleteAll();
}
/member/{member-id}
였는데, {member-id}부분이 필요없어지고, 컨트롤러에서의 메서드의 파라미터를 제거해줌으로써 에러없이 테스트가 성공하였다.완성코드는 다음과 같다.
@Rollback(false)
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
@Transactional
class MemberControllerTest {
@Autowired private MemberController memberController;
@Autowired private WebApplicationContext ctx;
private ObjectMapper objectMapper = new ObjectMapper();
private MockMvc mockMvc;
@Autowired MemberRepository memberRepository;
@BeforeEach
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(ctx)
.addFilters(new CharacterEncodingFilter("UTF-8", true)) // 한글 깨짐 처리
// .apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
@AfterEach
void afterEach() {
memberRepository.deleteAll();
}
// @BeforeEach
// public void setup2() {
// mockMvc = MockMvcBuilders.standaloneSetup(memberController).build();
// }
@WithAccount("creamyyyy")
@DisplayName("개인 정보 조회 테스트")
@Test
void getMyMember() throws Exception {
this.mockMvc.perform(
MockMvcRequestBuilders // MockMvcRequestBuilders 를 안쓰면 get 함수를 인식 못함
.get("/member") // 넣어준 컨트롤러의 Http Method 와 URL 을 지정
.accept(MediaType.APPLICATION_JSON) // accept encoding 타입을 지정
)
.andExpect(status().isOk())
.andDo(print());
}
/**
* String email = username + "@aaa.com";
* String password = "abcdefgh1234";
* String interest = "기타";
* @throws Exception
*/
@WithAccount("creamyyyy")
@DisplayName("개인 정보 수정 테스트")
@Test
void updateMyMember() throws Exception {
MemberReqDto.updateDto updateDto = new MemberReqDto.updateDto();
updateDto.setUsername("creamyyyy");
updateDto.setEmail("creamyyyy@aaa.com");
updateDto.setInterest("IT");
updateDto.setPassword("bbbbbbbb444");
this.mockMvc.perform(
MockMvcRequestBuilders // MockMvcRequestBuilders 를 안쓰면 get 함수를 인식 못함
.post("/member") // 넣어준 컨트롤러의 Http Method 와 URL 을 지정
.accept(MediaType.APPLICATION_JSON) // accept encoding 타입을 지정
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(updateDto))
)
.andExpect(status().isOk())
.andDo(print());
}
}
참고 >
https://tech.devgd.com/12
https://sbs1621.tistory.com/54
https://velog.io/@geesuee/Spring-Spring-Boot-MockMvc
https://shinsunyoung.tistory.com/52
https://github.com/codingspecialist/Junit5-Lecture/blob/main/src/main/java/site/metacoding/junitproject/service/BookService.java
https://github.com/code-chobo/dev-api/blob/develop/src/test/java/kr/codechobo/domain/study/api/StudyApiControllerTest.java