Test Code

    [참고 글] Test Double

    [참고 글] Test Double

    Stunt Double배우와 유사한 모습과 행위를 할 수 있어, 영화에서 위험하고 역동적인 액션을 대신 수행하는 사람. Stunt Man/Woman이라고도 함. 이러한 의미에서 가져온 Test Double.5가지 종류Dummy아무것도 하지 않는 깡통 객체.실제 객체를 모방하기만 한. 동작이나 행위에 대해 정의되어 있지 않음.Fake단순한 형태로 동일한 기능은 수행하나, 프로덕션에서 쓰기에는 기능이 부족한 객체Ex) FakeRepsotiroy : 실제 프로덕션에서는 DB에 직접 액세스하여 저장/조회하지만 Fake Repository에서는 memory map을 선언하고, 해당 객체에 저장/조회하는 방식으로 구현한다.ㄴ 이를 프로덕션에서 쓰기에는 기능이 부족함.Stub테스트를 수행하며 실제로 로직이 수행되지 ..

    테스트 환경에서 환경변수 설정하기

    테스트 환경에서 환경변수 설정하기

    서론 프로덕션 코드에서 설정 파일(application.yml) 내에 환경 변수 처리해 놓은 값을 사용하는 코드에 관해 테스트 코드를 작성하려 할 때는 환경변수 세팅을 해주어야 합니다. 어떤 방법이 제일 나을지 찾아보니, 여러 방식이 있어서 정리합니다. 테스트 환경에서 환경변수 설정하는 방법 1번째 방법) 테스트 코드에서 바라보는 환경설정 파일을 별도로 생성하는 방법. ⚠️ 애플리케이션 컨텍스트가 로드되는 테스트 코드이어야 함. (feat. @SpringBootTest) 프로덕션 코드에서 환경 설정 값들은 src/main/resources/application.yml (혹은 application.property) 에 위치해있을텐데, 테스트 코드에서도 로직 수행 시에 필요한 환경 설정 값들을 별도의 환경 ..

    [JUnit5] @Mock 필드 초기화 시점에 따른 @BeforeAll 이슈 (@BeforeEach, 테스트코드의 라이프 사이클)

    [JUnit5] @Mock 필드 초기화 시점에 따른 @BeforeAll 이슈 (@BeforeEach, 테스트코드의 라이프 사이클)

    서론 테스트 코드를 작성하던 중 @BeforeAll 애노테이션을 사용하다가 @BeforeEach 와의 차이점, 그리고 테스트 코드의 라이프 사이클을 정리해보고자 글을 작성합니다. 문제 상황 InstantService 클래스 생성 시에 Mocking처리한 InstantRepository를 세팅하기 위해 아래와 같은 코드를 작성하면서 문제를 마주쳤습니다. @ExtendWith(MockitoExtension.class) class test { @Mock private InstantRepository instantRepository; private InstantService instantService; @BeforeAll void setUp() { instantService = new InstantService..

    [JUnit5] 실패 케이스 테스트하기

    JUnit5를 이용해 예외 발생 케이스를 테스트하는 방법을 알아봅니다. 방법 1. assertThrows() 메서드 사용 Exception 발생 여부 확인과 Exception 메시지를 비교할 수 있습니다. 아래는 CafeKiosk 서비스 클래스의 add(~) 메서드에 0 혹은 음수를 전달했을 때 예외가 잘 발생하는지 확인하는 테스트 메서드입니다. class CafeKioskTest { @Test @DisplayName("[FAILED] 음료 수량으로 음수, 0은 불가능하다.") void addWithCount() { // given CafeKiosk cafeKiosk = new CafeKiosk(); // then Exception exception = assertThrows(OperationFailed..

    [테스트 코드] Controller Test Code / @WebMvcTest / 행위 검증

    Controller 클래스의 테스트 코드를 작성하다 보면 컨트롤러 단에서 호출하는 서비스 메서드가 호출할 때 어떤 값이 필요하고 어떤 값을 반환하는지 정도의 검증을 하는 작업도 함께 진행한다. 컨트롤러 메서드는 아래와 같이 존재한다. (ApiResult 클래스는 외부 응답 시 공통적으로 사용하는 클래스이다.) @RestController @RequiredArgsConstructor public class ControllerA { private final ServiceA serviceA; @PostMapping("/a") public ResponseEnity controllerMethodA () { serviceA.methodA(); return new ResponseEntity(ApiResult.succ..