테스트 코드의 구성
테스트 코드의 구성요소: 상황, 실행, 결과 확인
어떤 상황이 주어지고, 그 상황에서 기능을 실행하고, 실행한 결과를 확인하는 세 가지가 테스트 코드의 기본 골격을 이루게 된다.
상황, 실행, 결과 확인은 영어 표현 given, when, then에 대응한다.
대역
대역의 필요성
- 테스트 대상에서 파일 시스템을 사용
- 테스트 대상에서 DB로부터 데이터를 조회하거나 데이터를 추가
- 테스트 대상에서 외부의 HTTP 서버와 통신
테스트 대상에서 의존하는 요인 때문에 테스트가 어려울 때는 대역을 써서 테스트를 진행할 수 있다. 난이도가 높은 액션이 필요할 때 배우를 대신해서 연기하는 스턴트맨처럼 테스트에서는 외부 요인으로 인해 테스트가 어려울 때 외부 요인을 대신하는 대역이 외부 요인을 대신해서 테스트에 참여한다.
대역의 종류
대역종류 | 설명 |
---|
스텁(Stub) | 구현을 단순한 것으로 대체한다. 테스트에 맞게 단순히 원하는 동작을 수행한다. |
가짜(Fake) | 제품에는 적합하지 않지만, 실제 동작하는 구현을 제공한다. |
스파이(Spy) | 호출된 내역을 기록한다. 기록한 내용은 테스트 결과를 검증할 때 사용한다. 스텁이기도 하다. |
모의(Mock) | 기대한 대로 상호작용하는지 행위를 검증한다. 기대한 대로 동작하지 않으면 익셉션이 발생할 수 있다. 모의 객체는 스텁이자 스파이도 된다. |
Mockito 기초 사용법
Mockito는 모의 객체 생성, 검증, 스텁을 지원하는 프레임워크이다.
스텁 설정
모의 객체를 생성한 뒤에는 BDDMockito 클래스를 이용해서 모의 객체에 스텁을 구성할 수 있다.
- BDDMockito.given() 메서드는 스텁을 정의할 모의 객체의 메서드 호출을 전달한다.
- 이어 willReturn() 메서드는 스텁을 정의한 메서드가 리턴할 값을 지정한다.
- 익셉션을 발생하게 설정하기 위해서는 willThrow() 메서드를 사용한다.
인자 매칭 처리
만일 스텁을 설정할 때 사용한 인자와 일치하지 않을 경우 리턴 타입의 기본 값을 리턴한다. 예를 들어 리턴 타입이 int면 0을 리턴하고 boolean이면 false를 리턴한다. 기본 데이터 타입이 아닌 String이나 List와 같은 참조 타입이면 null을 리턴한다.
- org.mockito.ArgumentMatchers 클래스를 사용하면 정확하게 일치하는 값 대신 임의의 값에 일치하도록 설정할 수 있다.
- Mockito 클래스와 BDDMockito 클래스는 ArgumentMatchers 클래스를 상속하고 있으므로 Mockito.any() 나 BDDMockito.any()를 사용해도 된다.
- ArgumentMatchers 클래스가 제공하는 메서드
- anyInt(), anyShort(), anyLong(), anyByte(), anyChar(), anyDouble(), anyFloat(), anyBoolean: 기본 데이터 타입에 대한 임의 값 일치
- anyString(): 문자열에 대한 임의 값 일치
- any(): 임의 타입에 대한 일치
- anyList(), anySet(), anyMap(), anyCollection(): 임의 컬렉션에 대한 일치
- matches(String), matches(Pattern): 정규표현식을 이용한 String 값 일치 여부
- eq(값): 특정 값과 일치 여부
- ArgumentMatcher를 사용해서 설정한 경우 모든 인자를 ArgumentMatcher를 이용해서 설정해야 한다.
예제코드