서비스 단위 테스트

DAO를 사용하지 않는 부분을 테스트 하거나,
테스트 하려는 부분에서 사요하는 DAO 기능이 충분한 테스트를 거치지 않았거나,
테스트에서 사용하는 DAO가 아직 제대로 구현되지 않았거나,
실행이 오래 걸리는 DAO를 사용할 경우에
DAO를 목킹(mocking)하여 서비스 계층의 코드만 단위 테스트 할 수 있습니다.

테스트 하지 않을 것

DAO쪽으로 단순 위임하는 코드는 테스트하지 않습니다.

	public PurYearPlanDetail getPurYearPlanDetailById(int detailid) {
return dao.getPurYearPlanDetailById(detailid);
}

테스트 할 것

  • 서비스 인터페이스에 새로 추가하고 구현한 메서드
  • OSAF의 GenericService에서 상속받은 것을 재정의한 메서드

OSAF의 GenericService에서 상속 받은 것 중에서 재정의한 메서드를 테스트 합니다.

	public void update(PurYearPlan entity) {
super.update(entity);
entity.calcAll();
}
  • 비즈니스 로직

서비스에 포함되어 있는 복잡한 비즈니스 로직을 테스트 합니다.

	public void addPurYearPlanDetail(int yearplanid, PurYearPlanDetail detail) {
detail.calcAmount();
get(yearplanid).addDetail(detail);
}

public String getAutoGeneratedCode(Date year) {
String currentCode = null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
String syear = formatter.format(year);

String previousCode = dao.getCurrentCode(year);
if (previousCode != null) {
Integer currentNo = Integer.valueOf(previousCode.substring(4)) + 1;
currentCode = (currentNo / 10) > 0 ? syear + currentNo.toString()
: syear + "0" + currentNo.toString();
} else {
currentCode = syear + "01";
}
return currentCode;
}

테스트 코드 작성 방법

  • Mockito 러너 추가

MockitoJUnitRunner를 추가합니다.

  • 테스트 클래스 이름

테스트 대상인 클래스 이름에 UnitTest를 붙여줍니다.

@RunWith(MockitoJUnitRunner.class)
public class PurYearPlanServiceImplUnitTest {

}
  • 의존성 Mocking

@Mock을 사용해서 의존하는 인터페이스에 대한 목 객체를 만들고, @Before를 붙인 setUp 메서드에서 테스트 객체에 주입해 줍니다.
@Mock을 이용하면 mock(PurYearPlanDao.class); 같은 코드를 호출하지 않아도 MockitoJUnitRunner에 의해 자동으로 목 객체가 생성됩니다.

@RunWith(MockitoJUnitRunner.class)
public class PurYearPlanServiceImplUnitTest {

PurYearPlanServiceImpl service;
@Mock PurYearPlanDao mockDao;

@Before
public void setUp() {
service = new PurYearPlanServiceImpl();
service.setDao(mockDao);
}
...
}
  • 테스트 작성

테스테에 필요한 객체들을 정의하고 테스트 이후에 변경되는 값의 현재 상태를 확인합니다.
Mockito의 stub()을 사용하여 목 객체가 어떻게 동작해야 하는지 정의해 줍니다.
그런 다음 테스트 하려는 메서드를 실행합니다.
마지막으로 비즈니스 로직이 제대로 수행되었는지 여러 객체의 상태들을 확입합니다.

	@Test
public void addPurYearPlanDetail() throws Exception {
PurYearPlan yearPlan = new PurYearPlan();
int yearplanid = 1;
yearPlan.setId(yearplanid);
PurYearPlanDetail detail = new PurYearPlanDetail();

when(mockDao.get(yearplanid)).thenReturn(yearPlan);

service.addPurYearPlanDetail(yearplanid, detail);
assertThat(yearPlan.getDetails().size(), is(1));
}

생각해 볼 것

  • 목킹을 사용하는 여러 가지 경우를 좀 더 구체적으로 작성해야겠다.