Junit53 테스트 코드 뜯어보기 - @ParameterizedTest는 for문의 문법 설탕이 아니다 "같은 로직을 값만 바꿔 여러 번 돌린다"는 점만 보면 @ParameterizedTest는 for문과 비슷해 보인다. 그런데 실패가 났을 때 완전히 다르게 행동한다. 이 차이(실패 격리)와, 그걸 가능하게 하는 ArgumentsProvider SPI, 그리고 enum 상태 전이 검증에 이걸 어떻게 응용할지를 정리했다.Intro@ValueSource, @CsvSource, @MethodSource, @EnumSource는 전부 ArgumentsProvider SPI를 트리거하는 메타 애노테이션이다.@ParameterizedTest가 데이터 N개를 받으면 JUnit은 이를 N개의 독립 invocation으로 취급한다.for문은 첫 실패에서 즉시 중단돼 뒤 케이스가 검증 안 되지만, @Parameterized.. 2026. 7. 7. 테스트 코드 뜯어보기 - @WebMvcTest만 붙였더니 500이 났다 컨트롤러 슬라이스 테스트를 짜다가 만난 황당한 상황. @WebMvcTest를 정석대로 붙였는데 404도 아니고 500이 돌아왔다. 범인은 우리 앱의 scanBasePackages 설정이었고, 해결책은 @Import였다. 이게 왜 우리 레포에선 사실상 필수가 되는지 백그라운드까지 파봤다.Intro@WebMvcTest는 전체 컨텍스트 대신 MVC 계층만 가볍게 띄우는 테스트 슬라이스다.슬라이스는 명시적 설정이 없으면 위로 올라가며 @SpringBootApplication 클래스를 찾아 "주 설정"으로 재사용한다.우리 앱은 @SpringBootApplication(scanBasePackages = "com.acme.app.config")로 스캔 범위를 config 패키지로 좁혀놨다.그래서 슬라이스의 컴포넌트 .. 2026. 7. 5. 테스트 코드 뜯어보기 - LocalDateTime.now()는 왜 테스트를 괴롭히는가 우리 API 서버의 테스트 코드를 하나하나 뜯어보며 "이 애노테이션이 백그라운드에서 정확히 무슨 일을 하는가"를 정리한 시리즈다. 첫 글은 시간이다. 서비스 코드가 LocalDateTime.now()를 직접 부르는 순간 테스트가 어떻게 무너지는지, 그리고 우리 팀이 그걸 두 가지 전략으로 어떻게 나눠서 다루는지 적었다.IntroLocalDateTime.now()는 매 실행마다 다른 값이라 테스트가 isEqualTo로 정확히 단언할 방법이 없다.근본 해법은 Clock을 주입받아 LocalDateTime.now(clock)을 쓰는 것. 테스트에선 Clock.fixed(...)로 시간을 얼려서 결정론적으로 만든다.하지만 우리 코드베이스엔 now() 직접 호출이 65개 넘는 파일에 퍼져 있어서, 전부 소급 리팩.. 2026. 7. 5. 이전 1 다음