2014-12-01 160 views
0

我有一个普通的帮助类,它有我在服务级别类中使用的公共方法。当我为服务类编写测试并试图嘲笑这个助手类的方法之一时,它将进入方法并运行每一行。由于这个方法中的代码更复杂,我想用方法模拟helper类,这样我就不必关心helper类方法中的每个细节。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 2014-12-01 20:47:16

回答

2

您的测试情况下运行的所有线路中的“真实”的方法的原因,是因为你的模拟对象是永远不会被任何地方使用。

正如您所写,您不能在HistoryServiceImpl中模拟MemberUtil,因为您在getCaseHistory()方法中手动实例化它。您需要让getCaseHistory()从其他地方获得MemberUtil,以便您可以在您的测试课程中注入您的模拟版本。

最简单的解决办法是定义MemberUtil作为成员变量,从而使@InjectMocks注释可以覆盖默认值:

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

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

或者你可以有HistoryServiceImpl接受外部提供的MemberUtil,无论是在其构造函数或通过setter方法。然后,您可以轻松地在测试课程中传递模拟版本。

一般来说,实用程序类是无状态的,所以另一种可能的解决方案是将MemberUtil转换为使其所有方法都是静态的。然后你可以使用类似PowerMock的东西来模拟你的静态方法。

+0

它不需要在构造函数或setter方法中。 @InjectMocks注释可以设置私有字段;所以你所需要的只是一个'MemberUtil'类型的字段,并且这将按照你的预期工作。 – 2014-12-01 20:56:05

+0

@DavidWallace啊,你说得对,那更简单。我会更新我的答案。 – azurefrog 2014-12-01 21:05:50