테스트 대상 단위가 엄격하게 정해져있지는 않지만, 일반적으로 클래스 또는 메소드 수준으로 정해진다. 단위의 크기가 작을수록 단위의 복잡성이 낮아지고, 실행하려는 기능을 표현하기 더 쉬워진다. 단위 테스트는 해당 부분만 독립적으로 테스트하기 때문에 어떤 코드를 리팩토링하여도 빠르게 문제 여부를 파악할 수 있다. 개발자는 작성한 테스트 코드를 수시로 빠르게 돌리면서 문제점을 파악할 수 있다.
단위 테스트에 공통적으로 사용할 확장 기능을 선언해주는 역할을 한다. 인자로 확장할 Extension을 명시하면 된다. SpringExtension.class
또는 MockitoExtension.class
를 많이 사용한다. Spring Test Context 프레임워크와 Junit5와 통합해 사용할 때는 SpringExtension.class
를 사용한다. JUniit5와 Mockito를 연동해 테스트를 진행할 경우에는 MockitoExtension.class
를 사용한다. (스택오버플로우를 참고해보면 더 자세히 알 수 있다.)
개발자가 동작을 직접 제어할 수 있는 가짜(Mock) 객체를 지원하는 테스트 프레임워크이다. 일반적으로 Spring으로 웹 애플리케이션을 개발하면, 여러 객체들 간의 의존성이 생긴다. 이러한 의존성은 단위 테스트를 작성을 어렵게 하는데, 이를 해결하기 위해 가짜 객체를 주입시켜주는 Mockito 라이브러리를 활용할 수 있다. Mockito를 활용하면 가짜 객체에 원하는 결과를 Stub하여 단위 테스트를 진행할 수 있다.
Mock 객체를 생성한다. 실제로 메서드는 갖고 있지만 내부 구현이 없는 상태이다.
모든 기능을 가지고 있는 완전한 객체이다. Stub하지 않은 메소드들은 원본 메소드 그대로 사용한다. 즉, 테스트 대상의 일부분만 Mocking 하는 것이다. 대체로 @Spy
보다는 @Mock
을 쓰는 것을 추천하지만, 외부 라이브러리를 이용한 테스트에는 @Spy
를 사용하는 것을 추천한다.
@Mock
또는 @Spy
로 생성된 가짜 객체를 자동으로 주입시켜주는 객체이다.
@InjectMocks
객체에서 사용할 객체를 @Mock
으로 만들어 쓰면 된다. 만약 Service를 테스트하는 클래스를 생성했다면, Service 객체를 @InjectMocks
어노테이션을 사용해 생성하고, Service단에서 사용할 Repository와 같은 객체들은 @Mock
어노테이션을 사용해 생성하면 된다.
다른 객체 대신에 가짜 객체(Mock Object)를 주입하여 어떤 결과를 반환하라고 정해진 답변을 준비시킨다. Mock 객체의 메소드를 호출해도 실제로 코드를 실행하지 않기 때문에, 메소드의 행동을 미리 정해두어야 한다. when()
, thenReturn()
, thenThrow()
등을 사용해 리턴 값 또는 예외 발생을 정할 수 있다. 같은 조건으로 다시 stub 할 경우 이전의 행동을 덮어 씌운다.
doReturn / thenReturn
테스트 대상 기능 중 일부 기능이 준비가 되지 않았을 때 혹은 다른 시스템과 통신 등이 필요한 경우, 미리 리턴 값을 선언하여 테스트할 수 있다.
- doReturn
- 메소드를 실제 호출하지 않으면서 리턴 값을 임의로 정할 수 있다.
- 실제로 메소드를 호출하지 않기 때문에 대상 메소드에 문제점이 있어도 알 수 없다.
- thenReturn
- 메소드를 실제 호출하지만, 리턴 값을 임의로 정의할 수 있다.
- 메소드 작업이 오래 걸릴 경우 끝날 때까지 기다려야 한다.
- 실제 메소드를 호출하기 때문에, 대상 메소드에 문제점이 있을 경우 발견할 수 있다.
https://mangkyu.tistory.com/143
https://velog.io/@ausg/Mockito-Test-Framework-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
https://jojoldu.tistory.com/239
https://royleej9.tistory.com/entry/Mockito-doReturn-thenReturn