Test Double
- 테스트 대상 컴포넌트
(SUT)
가 의존하는 컴포넌트(DOC)
를 테스트 환경에 맞는 컴포넌트로 대체하는 것 - 테스트 더블은 테스트 환경 내에서 의존 컴포넌트와 동일하게 동작하도록 구성
- 테스트 시점에는 테스트 더블을 생성해서 SUT에 주입
Mock Object
Mock 객체
를 사용해서 해당 오퍼레이션에 대한 입출력을 간접적으로 검증함으로써, 테스트 대상의 내부 행위를 검증- Mock 객체를 사용하지 않을 경우 단위 테스트에서 의존관계를 맺는 컴포넌트를 생성하여야 하며, 이는 또 다른 테스트 환 경이 마련되어야 함을 의미
- 즉, 의존 관계가 깊어질수록 많은 테스트 환경이 필요한데, Mock 객체는 이러한 수고를 덜어줌
Mockito 개요
- 자바 단위테스트에서 가짜 객체를 지원해주는 프레임워크
- Mockito는 Szczepan Faber and friends에 의해 서비스가 제공
- Mock 객체 생성, Mock 객체 동작을 지정, 그리고 테스트 대상 로직이 제대로 수행 되었는지 확인
mock 객체 생성
- mock 메소드를 사용하여 mock객체를 생성
- mock객체를
Constructor
,Setter Parameter Injection
중 한가지 방식을 통해 주입
@Test
public void findProjectListByMock(){
//가상객체(mock객체)를 생성
ProjectEntity mock = mock(ProjectEntity.class);
//가상객체를 주입
userProcess.setProjectEntity(mock);
}
stub1 만들기
When
메소드를 통해 하나의 메소드가 호출되었을 때 임의 값을 반환 하라고 설정- 메소드의 파라미터 값까지 지정하고, 호출 시점에서 지정한 파라미터까지 동일해야 지정한 임의 값을 반환
@Test
public void findProjectListByMock() {
//1. 가상객체(목객체)를 생성
ProjectEntity mock = mock(ProjectEntity.class);
userProcess.setProjectEntity(mock);
//2. 결과값(예상값)을 녹화
List<String> projects = new ArrayList<>(); //가짜 객체에서 반환 할 값 생성
projects.add("정보원 프로젝트");
projects.add("직능원 프로젝트");
projects.add("인천공항 프로젝트");
when(mock.findProjectList("hjkwon")).thenReturn(projects); //가짜 객체에서 frndProjectList메소드의 파라미터로 ‘hjkwon’이 호출되면 위에저 지정한 값을 반환 하라고 설정
List<String> projectList = userProcess.findProjectList("hjkwon"); //Stub으로 지정 한 값 리턴 받음
assertNotNull(projectList);
assertEquals(3, projectList.size());
verify(mock, times(1)).findProjectList("hjkwon");
}
mock 객체 검증
verify
메소드를 통해 실제 로직 상에서 mock 객체의 메소드가 호출되었는지 확인하고 검증
Mockito 메소드 종류
Mock()
- 모의 객체를 생성하는 역할when()
- 협력객체 메소드 반환 값을 지정해주는 역할(stub)verify()
- SUT안의 협력객체 메소드가 호출 되었는지 확인times()
- 지정한 횟수 만큼 협력 객체 메소드가 호출 되었는지 확인nerver()
- 호출되지 않았는지 여부 검증atLeastOnce()
- 최소 한 번은 특정 메소드가 호출되었는지 확인atLeast()
- 최소 지정한 횟수 만큼 호출되었는지 확인atMost()
- 최대 지정한 횟수 만큼 호출되었는지 확인clear()
- 스텁을 초기화 한다timeOut()
- 지정된 시간 안에 호출되었는지 확인
테스트를 위한 로직 ↩