ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20.03.23 ~ 20.03.27 TWIL
    개발 일기장/TWIL 2020. 3. 30. 23:50

    벚꽃의 계절이 왔다.

    fixture란? 그렇다면 mock(mock object)는 무엇인가?

    테스트 코드를 작성할 때, 실제 DB에 가져오는 데이터나 실제 객체(인스턴스)가 아니라 직접 임의로 만들어주는 걸 다 mock이라고 생각했는데, fixture라는 개념이 있다는걸 알게 됐다.

     

    간단하게 말하면 fixture의 목적은 반복적인 테스트를 하기 위해 잘 알고 있고(well known) 고정된(fixed) 환경 내에서 이뤄지고 있다는 걸 보장하기 위함이다. input 데이터를 세팅하거나, mock 객체의 setup, creation이다. 또는 DB의 구체적인 데이터 셋을 세팅하는 것이다.

     

    이건 따로 포스팅을 하면 좋을 주제일 것 같아서 나중에 포스팅하고 링크를 걸어둬야겠다.

     

    작성한 포스팅으로

     

    추상화 신경쓰기

    호출하는 쪽에서는 내부적으로 어떤 조건일 때, 이메일을 발송하는지 알 필요가 없다.

     

    메서드 명에서 실제 로직이 추상화 없이 드러나게 되면 유연성이 떨어져 보인다.

        // Before
        private void sendMessageToUserWhenFileIsNull(User user) {
            if (user.hasFile()) {
                log.info("파일을 가졌으므로 메일 발송 하지 않음, 유저 아이디 : {}", user.getUserId())
                return;
            }
    
            sendEmailToUser(user.getEmail());
        }
    
        // After
        private void sendMessageToUser(User user) {
            if (user.hasFile()) {
                log.info("파일을 가졌으므로 메일 발송 하지 않음, 유저 아이디 : {}", user.getUserId())
                return;
            }
    
            sendEmailToUser(user.getEmail());
        }

     

    java 8을 쓴다면, map, filter, method reference를 잘 활용해보자.

    java 8에 유용한 라이브러리들이 많은데 활용을 잘 못하고 있다.

     

    라이브러리를 잘 활용하지 못하고 짠 코드들이 제목의 라이브러리를 활용해서 코드를 리팩토링하는지 살펴보자!

        // Before
        public String getDescriptions(Content content) {
            StringBuilder descriptionMessage = new StringBuilder();
    
            content.getDescriptions().forEach(description -> {
                if (description.getExplanation() == null) return;
    
                descriptionMessage.append(description.getExplanation());
                descriptionMessage.append(System.lineSeparator());
            });
    
            return descriptionMessage.toString();
        }
    
        // After
       public String getDescriptions(Content content) {
            StringBuilder descriptionMessage = new StringBuilder();
    
            content.getDescriptions()
                    .stream()
                    .map(Description::getExplanation)
                    .filter(Objects::nonNull)
                    .forEach(description -> {
                        descriptionMessage.append(description);
                        descriptionMessage.append(System.lineSeparator());
                    });
    
            return descriptionMessage.toString();
        }

    두 번 부를 호출을 한 번으로 줄일 수 있어졌다.(getExplanation()의 호출 횟수)

     

    긴 null 체크 코드(상대적으로)를 Objects::nonNull이라는 메서드 레퍼런스와 Objects가 제공해주는 메서드를 이용해 간단하게 null 체크를 할 수 있게 되었다. 

     

    좀 더 java 8 스러운(?) 코드가 작성되었다.

    '개발 일기장 > TWIL' 카테고리의 다른 글

    20.04.20 ~ 20.04.24 TWIL  (0) 2020.04.26
    20.03.30 ~ 20.04.03 TWIL  (0) 2020.04.04
    20.03.16 ~ 20.03.20 TWIL  (0) 2020.03.21
    20.03.09 ~ 20.03.14 TWIL  (0) 2020.03.15
    20.03.02 ~ 20.03.07 TWIL  (0) 2020.03.07
Designed by Tistory.