IntelliJ에서 테스트코드를 작성할 때, Assertions 키워드를 작성하면 자동완성 기능으로 두 가지를 추천해준다. 하나는 org.junit.jupiter.api.Assertions이고, 하나는 org.assertj.core.api.Assertions이다. 강의를 듣거나 다른 사람들의 코드들을 보면, 보동 후자를 사용하곤 한다. 심지어 JUnit5 공식 문서에 가도 서드파티 라이브러리인 AssertJ 사용을 권장한다. 그러면, 왜 다들 AssertJ를 쓰는걸까? 1. 가독성 다음 두 가지 메서드를 보아라. // 1. assertEquals(a, b); // 2. assertThat(a).isEqualTo(b); 1번 코드를 보면 어느것이 실제 값이고, 어느 것이 예상 값인지 쉽게 유추할 수 없다...
public void drive() { Random random = new Random(); int number = random.nextInt(10); if (number >= 4) { position += 1; } } 자동차는 랜덤한 숫자를 하나 선택하고, 이가 4 이상이면 전진한다. 자동차의 전진 여부를 테스트하기 위해선 어떻게 해야할까? @DisplayName("자동차 전진 테스트") @Test void driveTest() { Car car = new Car("test"); car.drive(); assertThat(car.getPosition()).isEqualTo(1); } 이렇게 테스트하면.. 0~3이면 실패고, 4~9면 성공이니 60% 확률로 성공한다. 그러면 이를 @RepeatedTest..
프리코스때는 다음과 같이 InputView에서 도메인을 생성해 return해주었다. // InputView.java public List readCoaches() { List coachNames = readWordsSeparatedByComma(); validateCoach(coachNames); return convertToCoach(coachNames); } 하지만 View에서 Domain을 생성까지 담당하면, InputView의 책임이 너무 커지는 것 같았다. 따라서 이번 미션에서는 InputView는 문자열 및 원시값을 전달해주는 역할만을 하도록했다. Domain으로 바꿔주는 것은 Controller의 책임이라 생각했다. 다만, “a,b,c”를 List.of(a,b,c); 문자열 파싱해주는 것은 ..
입력값 검증을 InputView에서 진행할까, Domain에서 진행할까? 가장 많이 고민했던 부분이다. 입력값 검증을 input할 때 View에서 해야할지, domain을 생성하는 시점에 해야할지 고민했다. 웹서비스에서의 회원가입 절차에서는 올바르지 않은 입력값(ex. 비밀번호 특수문자 미포함, 10자 이하 등)의 경우 주로 웹프론트엔드에서 검증한다. 중복된 아이디의 경우 주로 백엔드에서 검증한다. 따라서 빈 입력값 및 글자수 제한 등의 조건은 View에서 처리하고, 중복 등과 같은 조건은 Domain에서 처리하는 방법을 생각해봤다. 하지만 페어와 협의 과정에서 해당 미션에서는 “자동차 이름이 중복될 수 없다.”라는 조건이 없기에 중복된 이름에 대해서는 이름 뒤에 구분자 및 식별숫자를 붙여주기로 결정했다..