下面的方法有 3 种可能的路径: 1. 没错, 2. 错误, 3.异常。
为了测试它,我需要为 True
和 Exception
路径模拟私有(private) getWootsWithAvailableProducts
。然而,集体智慧似乎在说你不应该 mock 私有(private)方法。如果我不模拟私有(private)方法并监视它以进行验证,我还能如何测试这些路径。如果这一切都是真的,为什么模拟私有(private)方法如此困难。如果它不是真的,我错过了什么?
正在测试中:
public List<Woot> findAllWoots(final boolean isBuy) throws Exception {
final List<Woot> allWoots = wootService.findAllWoots();
return isBuy ? getWootsWithAvailableProducts(allWoots) : allWoots;
}
更多详情:
getWootsWithAvailableProducts
调用发出网络请求的公共(public)服务。因此,我可以模拟实际的服务类并防止发生任何网络请求。
private List<Woot> getWootsWithAvailableProducts(List<Woot> allWoots)
throws ServiceException {
final String stringOfWootIds = buildStringOfCommaSeparatedIDs(allWoots);
final List<Count> categoryIDs = wootSearchService
.getWootIDsOfAvailableProducts(stringOfWootIds);
return filterOnlyWootsWithAvailProducts(allCategories, categoryIDs);// also private.
}
最佳答案
从评论中可以看出 getWootsWithAvailableProducts
calls a service that makes a network request
这是一个外部依赖项,应该将其抽象为自己的关注点,因为它与您的代码紧密耦合并且难以单独测试。
public interface WootProductsService {
List<Woot> getWootsWithAvailableProducts(List<Woot> woots);
}
所述抽象的实现将封装网络调用,解耦原始代码,以便在隔离测试方法时可以模拟抽象。
WootProductsService wootProductService; //Injected
public List<Woot> findAllWoots(final boolean isBuy) throws Exception {
final List<Woot> allWoots = wootService.findAllWoots();
return isBuy ? wootProductService.getWootsWithAvailableProducts(allWoots) : allWoots;
}
您现在可以控制所有依赖项,并可以在测试所有场景时根据需要操作它们。
注意您的方法和类的问题,因为它们会表明您的类是否做得太多。
如果在测试代码时遇到问题,请将其视为设计有问题的标志。查看问题的原因并考虑需要应用哪些重构以使代码更可靠。
关于java - JMockit - 验证私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49325374/