inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[인프런 워밍업 클럽 백엔드 스터디 2기] 4주차 발자국

ykm8864
0

마지막 4주차 발자국을 작성하는 시간이다.

 

Mockito로 Stubbing 하기

mock에 대한 원하는 행위(return)을 정의한 다음 내가 테스트하고자하는 서비스에만 집중. ⇒ stubbing이라고 일컷는다.

Mockito에서 Stubbing은 모의 객체(Mock)의 메서드가 호출될 때 반환할 값을 미리 설정해 두는 작업을 말한다.

테스트할 때 실제 객체 대신 Mockito로 생성한 모의 객체를 사용하는데, 이때 필요한 메서드의 동작을 미리 정의해 주는 것을 Stubbing이라고 한다.

이렇게 설정하면 실제 메서드가 호출되지 않고, 지정된 값이나 행동을 반환하므로 독립적인 테스트가 가능한 이점이 있다..

Stubbing을 설정하려면 whenthenReturn 또는 thenThrow 메서드를 사용하여 원하는 값을 정의한다.

 

Test Double

단위 테스트에서 사용되는 용어로, 테스트하려는 코드의 의존성이나 협력 객체를 대신하여 사용하는 객체를 말한다. 크게 아래 5가지가 있다.

Mock ≠ Stub

공통점은 가짜객체. 차이점 : Stub 은 상태에 대한 검증, Mock은 행위에 대한 검증이다.

 

@Mock, @MockBean, @Spy, @SpyBean, @InjectMocks 의 차이

테스트 객체를 생성해주는 다양한 어노테이션이 있다.
크게 Spring 기반 테스트인지 Mockito 기반 테스트인지 구분을 하고 spy 인지 아닌지로 나눌 수 있다.

Mokito사용해서 mock만들려면 클래스 상단@ExtendWith(MockitoExtension.class) 를 붙여줘야한다.

 

BDDMockito

어? given 절인데 문법이 when이네?

Mockito를 감싸고있는 BDD(GIVEN, WHEN, THEN)스타일로 작성만 할 수 있게 이름만 바꾼 상태!! 그래서 그냥 BDDMockito 사용하면 된다. 앞으로는

 

Classicist VS. Mockist

테스트코드를 전적으로 믿냐 아니냐에 대한 견해 차이로 보인다.

Mockist : 단위테스트할떄 이미 모든걸 mocking으로 테스트했으니까, 통합테스트할떄는 다 mocking처리해서 기능 보장된 애들은 다 쳐내고 해야하는 것만 짤라서 하자.

vs.

Classicist : mocking을 다 해버리면 실제 production에서 실 객체가 움직일때의 올바른 동작을 어떻게 보장할 수 있어?

 

개인적으로 나도 우빈님처럼 Classicist에 더 가까운 편인 거 같다. 테스트 코드는 아무리 완벽하게 하려고 해도 프로덕션 코드에 따라가지 못한다고 생각하고 결국 테스트를 작성하는 사람도 나 자신이기 때문에 허점은 존재할 거 같다.

 

Clean 테스트 코드

 

@ParameterizedTest

하나의 테스트 메서드를 다양한 매개변수로 반복 실행할 수 있도록 하는 어노테이션

사용 예: 여러 입력값에 대해 동일한 로직을 테스트할 때 활용

 

@DynamicTest

런타임에 테스트 케이스를 생성한다. 정적인 테스트 메서드로 정의되는 것이 아닌 Stream<DynamicTest> 형식으로 생성한다.

사용 예: 테스트 시나리오가 복잡하고 실행할 테스트 케이스의 수나 조건이 실행 중 결정되는 경우에 유용하다.

 

Spring REST Docs

API의 구조, 기능, 요청 및 응답 형식 등을 문서화

강의에서 여러 설정을 잡고 최종적으로 REST Docs문서를 생성하여 브라우저를 통해 확인해보았다. 테스트 과정을 거치며 각각의 문서 조각들이 모여 하나의 문서가 되는 것이 재밌었다.

 

4주차 회고

 

 

백엔드 워밍업클럽백엔드2기 발자국 몰입하는개발자 테스트코드

답변 0