2014-12-01 2 views
0

나는 서비스 수준 클래스에서 사용하고있는 공용 메서드로 일반 도우미 클래스를 가졌다. 서비스 클래스에 대한 테스트를 작성하고 메서드 중 하나에 대해이 도우미 클래스를 모의하려고하면 메서드 내에서 모든 행을 실행합니다. 이 메소드 내부의 코드가 더 복잡하기 때문에 메소드로 도우미 클래스를 모의하고 싶어서 헬퍼 클래스 메소드의 모든 세부 사항을 처리 할 필요가 없습니다.Mockito로 조롱하는 도우미 클래스

서비스 클래스

class HistoryServiceImpl implements CaseHistory { 
    @Override 
    public List<CaseHistoryDto> getCaseHistory(Individual member, Individual provider) { 
    MemberUtil memberUtil = new MemberUtil(); 
    List<CaseHistoryDto> caseHistoryDtoList = new ArrayList<CaseHistoryDto>(); 
    List<CaseHistory> caseHistoryList = caseDetailDao.fetchCaseHistory(member.getId(), provider.getId()); 
    for(CaseHistory caseHistory : caseHistoryList) { 
     CaseHistoryDto caseHistoryDto = new CaseHistoryDto(); 
     caseHistoryDto.setMemberInfo(memberUtil.getMemberInfo(member, caseHistory.getCreateDate())); 
     caseHistoryDtoList.add(caseHistoryDto); 
    } 
    return caseHistoryDtoList; 
    } 
} 

당신의 모의 객체가 임의의 장소에서 사용되고 있지 않습니다 때문에 테스트 클래스

Class HistoryServiceTest { 
    @Mock MemberUtil memberUtil; 
    @InjectMocks private HistoryServiceImpl historyServiceImpl = new HistoryServiceImpl(); 

    @Test 
    public void testGetCaseHistory() { 
    //why this line going inside real method and executing all lines? 
    when(memberUtil.getMemberInfo(any(Individual.class), any(Date.class))).thenReturn(member); 
    } 
} 
+0

무엇이 문제입니까? – sfjac

답변

2

테스트 케이스가 "진짜"방법의 모든 라인을 실행하는 이유입니다 .

getCaseHistory() 메서드로 수동으로 인스턴스화했기 때문에 서면 작성한대로 을 HistoryServiceImpl에 조롱 할 수 없습니다. getCaseHistory()MemberUtil 다른 곳에서 가져와 테스트 클래스에 모의 버전을 삽입 할 수 있도록해야합니다.

가장 간단한 솔루션은 @InjectMocks 주석이 기본값 오버라이드 (override) 할 수 있도록 멤버 변수로, 당신의 MemberUtil 정의하는 것입니다 :에 하나, 다른 방법으로

class HistoryServiceImpl implements CaseHistory { 
    MemberUtil memberUtil = new MemberUtil(); 

    @Override 
    public List<CaseHistoryDto> getCaseHistory(Individual member, Individual provider) { 
     ... 
    } 
} 

당신이 HistoryServiceImpl이 외부 MemberUtil 제공을 수용 할 수는 생성자 또는 setter 메서드를 통해 생성됩니다. 그런 다음 테스트 클래스에서 조롱 한 버전을 쉽게 전달할 수 있습니다.

일반적으로 유틸리티 클래스는 상태 비 저장이므로 MemberUtil을 변환하여 모든 메서드를 정적으로 변환하는 것이 좋습니다. 그런 다음 PowerMock과 같은 것을 사용하여 정적 방법을 조롱 할 수 있습니다.

+0

생성자 또는 설정 메소드에있을 필요는 없습니다. @InjectMocks 주석은 비공개 필드를 설정할 수 있습니다. 그래서 당신이 필요로하는 것은'MemberUtil' 타입의 필드입니다. 이것은 예상대로 작동 할 것입니다. –

+0

@DavidWallace 아, 네 말이 맞아, 그게 더 간단 해. 내 대답을 업데이트 할게. – azurefrog