-
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