JMockit - 验证私有方法

时间:2018-03-16 16:21:11

标签: java testing jmockit

以下方法有3种可能的路径: 真的, 2.错, 3.例外。

要对其进行测试,我需要模拟getWootsWithAvailableProductsTrue路径的私有Exception。然而,集体智慧似乎在说你不应该模仿私人方法。如果我不嘲笑私有方法并监视它以进行验证,我还能如何测试这些路径。如果这一切都是真的,那么为什么模仿私有方法如此困难。如果不是真的,我错过了什么?

测试中:

  public List<Woot> findAllWoots(final boolean isBuy) throws Exception {

    final List<Woot> allWoots = wootService.findAllWoots();

    return isBuy ? getWootsWithAvailableProducts(allWoots) : allWoots;
  }

进一步详情:

getWootsWithAvailableProducts调用发出网络请求的公共服务。因此,我可以模拟实际的服务类并防止发生任何网络请求。

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.
}

2 个答案:

答案 0 :(得分:1)

从评论中可以看出getWootsWithAvailableProducts

  

调用发出网络请求的服务

这是一个外部依赖,应该被抽象出来,因为它紧密耦合你的代码并且很难单独测试。

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;
}

现在,您可以控制所有依赖项,并可以在测试所有方案时根据需要对其进行操作。

注意你的方法和扩展课程的关注点,因为它们会表明你的课程是否做得太多。

在测试代码时遇到问题时,请将其视为其设计不正确的标志。查看问题的原因并考虑需要应用哪些重构来使代码更加SOLID。

答案 1 :(得分:0)

您可以为调用此私有方法的可访问方法编写测试,然后测试所有可能的结果

另外,请确保您正在模拟其他类函数以及在测试时执行私有函数时可能导致问题的所有变量。

基本上,你将测试这样的可能场景:

私有函数返回时的公共函数

  1. true
  2. 例外
  3. 希望有所帮助。