이번 주제는 테스트 관련입니다.

 

스프링에서는 @Value annotation을 통해서 application.properties에서 값을 가져와서 변수에 줄 수 있습니다.

이런 식으로 자주 이용합니다.

 

그렇다면 이를 테스트 하려면 어떻게 해야 할까요?

 

이렇게 테스트를 할 수 있습니다. 만약 @SpringBootTest가 없으면 name에 null이 들어갑니다.

 

하지만 서비스가 커지면, @SpringBootTest를 할 시에 테스트 실행 속도가 느려집니다. 그리고 다른 곳에서 bean을 주입할 때 에러가 생기는 등 이러한 현상이 발생하게 되면 이 테스트는 실패하게 됩니다.

 

 

단위 테스트를 하려면 어떻게 해야 할까요?

이런 식으로 할 수 있습니다.

 

만약 MyService에서 스프링 빈 주입 없이 단위 테스트를 하려면, setter를 선언해주거나 아니면 

Assertions.assertEquals("input", new MyService("input").getName());

 

이렇게 생성자를 따로 만들어줘야 합니다. 이는 lomok의 @RequiredArgsConstruct를 넣어도 소용 없습니다.(final로 선언되어 있지 않아서)

 

그리고 @Value를 사용하려면 final을 붙이면 안되는데, 이는 다른 곳에서 변경을 할 수도 있다는 것을 의미합니다.

그래서 위의 방법이 저는 좋다고 생각합니다.(물론 생성자를 정의해줘야 하는 단점이 있습니다.)

 

일단 @Value를 통해 값이 제대로 들어가는 지 확인해봤습니다.

테스트를 통과합니다!

 

그렇다면 @SpringBootTest 없이 테스트 진행해보겠습니다.

이렇게 할 수 있습니다!

 

단위 테스트하기 좋아진 것을 볼 수 있습니다.

반응형

+ Recent posts