남 글 읽기 github
테스트하기 좋은 코드 - 제어할 수 없는 코드 개선 - 기억보단 기록을 을 읽고 작성한 내용 입니다.
LocalDateTimw.now()
와 같이 실행 시점마다 값이 달라지는 값에 의존하는 테스트는 테스트하기 좋지 않은 코드, 제어할 수 없는 코드다.
테스트 하기 어려운 로직이 도메인 로직에 들어있을 경우, 도메인에 의존한 전반적인 계층에 대한 테스트가 모두 어려워질 수 있다.
즉 테스트의 어려움은 전파된다.
해결방법 1
- 생성자, 함수(메소드)의 인자로 테스트하기 어려운 코드의 결과를 받는다.
- 함수의 인자가 너무 많아진다고 생각이 들 수 있음
- 이때는 DTO 로 묶어서 전달하거나, 생성자 주입을 받아서 사용하거나, 함수 인자의 기본값을 사용하면 됨
- (기본값 괜찮네, 테스트 할때는 직접 사용하고 싶은 값 넣어서 사용하면 됨)
- 그런데 자바는 python 이나 javascript 처럼 default parameter 를 지원하지 않네
- Does Java Have default parameters? - dev in web 을 참고해보면 method overloading, null 활용, 빌터 패턴 사용 등을 보여주는데
- 빌터 패턴이 제일 바람직해 보임
- 만약 위에서의 방법을 안쓴다면, 일단 제어할 수 없는 코드의 위치를 가장 바깥 쪽으로 밀어내는 방법도 있음.
- repository 에서 service 로 service 에서 controller 로 해당 코드의 결과 값을 전달하는 곳을 밖으로 빼면
- 그 안의 로직은 안전할 수 있음
- 하지만 이 또한 controller 와 같은 바깥 로직은 테스트 하기가 어려워지므로 피하는게 좋음
해결방법 2
- 의존성 주입을 사용한다.
- 인터페이스 구현체를 만들어서 하나는 메인코드에, 다른 하나는 테스트 코드에 사용
- 테스트에서 사용할 구현체에는 명확한 데이터를 전달하면 되므로 테스트 하기 어려운 코드를 테스트 할 수 있게 만들어준다.
결론
- 디폴트 파라미터 사용과 의존성 주입을 사용하면 된다!