java - JMockit - 验证私有(private)方法

标签 java testing jmockit

下面的方法有 3 种可能的路径: 1. 没错, 2. 错误, 3.异常。

为了测试它,我需要为 TrueException 路径模拟私有(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/

相关文章:

java - JTextfield,如何验证getText()方法中的内容

java - 将 spring 配置文件添加到 SpringBootTest 中的现有配置文件中

java - 如何在 JMockit 中模拟具有 void 返回类型的方法?

java - JMockit - 部分模拟和模拟父级

java - 我如何使用 jemmy 测试应用程序退出

java - JMockit - 模拟 System.getProperties() 时为 "Missing invocation to mocked type"

java - 创建 kubernetes 部署时,Quarkus RestClient 属性的环境值无效

java - Android 中的序列化

java - 从End到Start解析json

testing - 当验收测试有不同的用户选择并且您想测试每个选择时该怎么办