在jmockit中模拟被测试类的私有方法

问题描述:

我想用类似私有方法测试ProcessServiceImpl类的过程方法:readContentisValidFileuserService类。在jmockit中模拟被测试类的私有方法

@Named("processServiceImpl") 
public class ProcessServiceImpl { 

    @Inject 
    private UserService userService; 

    public User process(Long userId, File inputFile) throws InvalidFileException { 
     User user = userService.load(userId); 
     String fileContent = readContent(inputFile); 
     if (isValidFile(fileContent)) { 
      User updatedUser = userService.updateUser(user, fileContent); 
      return updatedUser; 
     } else { 
      throw new InvalidFileException(); 
     } 
    } 

    private String readContent(File inputFile) { 
     //implementation 
    } 

    private boolean isValidFile(String fileContent) { 
     //implementation 
    } 
} 

我嘲笑了UserService并成功注入。但我不能在测试下嘲笑这个班级的私人方法。基于thisthis链接我试图嘲笑他们与NonStrictExpectations,但它没有任何invoke方法!有没有另一种方法来做到这一点? (我使用jmockit-1.8)

new NonStrictExpectations(processServiceImpl) {{ 
    invoke(processServiceImpl, "readContent"); 
    result = ""; 
}}; 

invoke(...)方法是从mockit.Deencapsulation类。

但我会推荐而不是模拟private方法。相反,请使用包含有效内容的真实文件进行测试。

+0

在这个特定的用例中你是对的。但是在一个依赖于某些类(方法调用)的复杂私有方法中,我认为嘲笑它并不是很糟糕,而不是嘲笑所有的依赖类。 – united 2014-10-29 20:44:03