테스트 코드를 작성하면서..2

jungnoeun·2023년 1월 25일
0

kiri

목록 보기
4/13

이전까지는 서비스 코드를 테스트하는 방법만 알았다.
테스트하는 방법에 대해 검색하던중, 컨트롤러 코드를 작성하는 방법이 있다는 것을 알게 되었다. 바로 MockMvc를 사용하는 것이다.


에러 발생

java.lang.AssertionError: Status expected:<200> but was:<500>
Expected :200
Actual   :500

아래 코드를 적었지만 에러가 발생했다.

내가 예상하고 있는 에러는
1. jwtHeader = null
-> @WithAccount("creamyyyy")를 적어줬음에도 왜 이렇지?
다음 코드를 추가해주었다.

@AfterEach
    void afterEach() {
        memberRepository.deleteAll();
    }

  1. 1을 시도했더니, 405 에러가 발생했다.
    원래 url은 /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

profile
개발자

0개의 댓글