컴공생의 발자취

[내일배움캠프 43일차 TIL] 테스트 활용 과제 재제출 본문

🤝 활동/내배캠TIL

[내일배움캠프 43일차 TIL] 테스트 활용 과제 재제출

MNY 2024. 6. 19. 00:43
728x90
반응형
2024.06.18.(화)
오늘의 진도 : 테스트 활용 과제 재제출까지...

원래는 Service Test까지 하려고 했는데에...
개인과제 재제출, 면담, 오늘의 회고 이렇게 3개의 큰 틀로 나누어 정리할 것이다.

 

개인과제 재제출

  • 추가적으로 구현한 기능
    • Conctoller Test 추가하기
      • @WebMvcTest 를 사용하여 Controller Test 를 추가합니다.
      • Post, Comment Controller 에 대해서 테스트를 추가합니다.
      • 특정 상황에 예외가 정상적으로 발생하고 있는지도 테스트 합니다.
  • 내가 받은 피드백
    • 의존성 관리나 mock을 사용하는 것에 대한 것들을 처음 진행하면서 지금까지 스프링이 나 대신 얼마나 많은 것들을 해줬는지를 생각해보게 되는 시간으로 관점을 바꿔서 생각. 이게 어렵다면 이 부분에 대해서 더 공부를 하다보면 자연스럽게 스프링 특히 빈과 의존성 주입에 대해 더 생각.
    • 테스트 케이스 설계는 생각을 조금 더 단순하게. 사실 여러가지 고민해야 좋은 테스트 코드가 나오는 것은 맞지만, 그건 일단 많은 테스트 코드를 작성한 후에 하면 좋은 고민이고 당장은 테스트하는 로직에 대해서 (아마 메서드를 단위로) '모든 분기를 건드리는 코드를 작성한다' 하나만 생각하면 좋다.
    • 서비스 코드의 테스트 코드가 가장 중요하다. 나중에 컨트롤러는 넘어가더라도 꼭 챙겨야한다!!!!!!!!
      // 죄송합니다.. 요 부분을 못 읽었어요ㅎ.....
  • 다른 팀원들의 피드백
    • 메세지를 검증하는 경우 로컬 언어에 따라 다르게 나올 수 있으니 locale을 설정
      ex)  Locale.setDefault(Locale.KOREAN);
    • 테스트 코드를 작성하기 위해 entity에 생성자( = AllArgsConstructor), setter을 추가하는 것은 주객전도이니 최대한 추가하지 않고 테스트 코드 작성
    • 불필요한 테스트 코드는 지우는 것도 개발자의 역할
    • CommentServiceTest 같은 경우 Mocking 통한 단위테스트를 시도하시고 계신데 여기에 @SpringBootTest를 추가하고 CommenService를 주입받아와 테스트. 이렇게하면 단위테스트 처럼 보이지만 결국 Spring Context 환경에 의존해서 테스트가 되고 있기 때문에 효율적이지 못함. @InjectMocks, @ExtendWith(MockitoExtension.class) 키워드로 찾아서 학습
  • 과제 재제출 후의 고촬

Service 로직의 Test 코드를 작성하다는 게 더 중요한 것을 몰랐다. 내일이 팀 프로젝트 시작이 아니었다면 Service의 Test 코드를 작성해보았을텐데.. 튜터님의 피드백 마지막 줄을 제대로 읽지 않고 과제를 진행한 나의 잘못이다ㅠ

일단은! 내일 팀 프로젝트니까 그거에 집중하고 주말에라도 Service의 Test 코드를 작성해야겠다.

 

  • 아쉬웠던 부분
    • Test의 CommenTest.java (test package의 다른 테스트 코드 포함)처럼 수정하지 못한 것
    • ServiceTest 코드를 작성하지 못한 것

* 참고 Repository

 

GitHub - thesun4sky/todoParty

Contribute to thesun4sky/todoParty development by creating an account on GitHub.

github.com

* 제출한 Repository

 

GitHub - ysy56/movieFeed: 🎞 영화 소개 뉴스피드

🎞 영화 소개 뉴스피드. Contribute to ysy56/movieFeed development by creating an account on GitHub.

github.com

 


면담(질문)

  • CommentMvcTest.java
@Test
@DisplayName("댓글 등록 요청 처리")
void test2() throws Exception {
    User user = mockUserSetup();
    Board board = new Board();

    Long boardId = 1L;
    String content = "Test Content.";

    CommentRequestDto requestDto = new CommentRequestDto(content);

    Comment comment = new Comment(requestDto, board, user);

    CommentResponseDto responseDto = new CommentResponseDto(comment);

    given(commentService.postingComment(any(CommentRequestDto.class), any(Long.class), any(User.class)))
            .willReturn(responseDto);

    String postInfo = objectMapper.writeValueAsString(requestDto);

    mvc.perform(post("/api/boards/{boardId}/comment", boardId)
                    .content(postInfo)
                    .contentType(MediaType.APPLICATION_JSON)
                    .accept(MediaType.APPLICATION_JSON)
                    .principal(mockPrincipal)
            )
            .andExpect(status().isCreated())
            .andDo(print());
}

 

  • CommentRequestDto.java
@Getter
public class CommentRequestDto {
    private String content;

    public CommentRequestDto(@JsonProperty("content")  String content) {
        this.content = content;
    }
}

 

  • Q : 위와 같이 코드가 작성되어 있다고 했을 때, CommentRequestDto.java > @JsonProperty("content") 이 코드 없이 그냥 String content라고 했을 때 아래의 사진처럼 400 error가 표시됩니다. BoardMvcTest에서도 CommentMvcTest와 비슷한 형식으로 작성했을 때는 제대로 동작을 했는데 왜 CommentMvcTest는 JsonProperty가 없으면 제대로 동작을 안 하나요?

  • A : 필드명도 같고 역직렬화가 아닌 직렬화인데도 이러한 문제가 발생하여 JsonProperty를 작성해야 하는 것은 생성자 때문입니다. 아래와 같이 기본생성자를 추가해주면 됩니다.  String content가 매개변수로 들어가 있는 생성자를 생성하게 되면 기본생성자(매개변수가 없는 생성자)는 매개변수가 1개 있는 생성자로 대체되어서 그렇습니다.
@Getter
public class CommentRequestDto {
    private String content;

    public CommentRequestDto() {
    }

    public CommentRequestDto(String content) {
        this.content = content;
    }
}

 

  • Q : 그렇다면 BoardMvcTest에서 BoardRequestDto는 기본생성자가 없어도 제대로 동작합니다. 이건 왜 그런가요?
    // 이건 튜터님도 모르셔서 찾아주신다고 하셨음! 나도 이거 진짜 궁금하네.. 뭐가 문제인지ㅠ
@Getter
public class BoardRequestDto {
    private String title;
    private String content;

    public BoardRequestDto(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

 


오늘의 회고

  • 12시간 중 얼마나 몰입했는가?

그래도 2-3시간은 최소 몰입해서 공부하지 않았나 싶다.

 

  • 오늘의 생각

오늘도 공부하기 대따 싫었는데..

튜터님 중 한 분이 알려주신 뽀모도로 공부법? 그걸 사용해서

25분 공부 5분 휴식 또는 50분 공부 10분 휴식 이런 식으로 공부했더니

나름 그래도 성과가 나왔다. 내일 팀 프로젝트 걱정 반, 기대반..

그리고 어쨌거나 이것도 공부긴 한데 책 읽는 거 넘나 재밌당✨

 

  • 내일 학습할 것은 무엇인지

팀 프로젝트가 무엇인지 확인 후 팀원들이랑 계속 회의하면서 설계를 진행할 것 같다.

이번에는 추가구현까지는 필수로하되, 명예의 전당 기능은 추가하기 쉽도록 설계하기로 했다.

728x90
반응형