【问题标题】:Java test class with many private methods [duplicate]具有许多私有方法的Java测试类[重复]
【发布时间】:2015-03-14 05:30:00
【问题描述】:

我有一个班级负责将合同从 CSV 导入数据库。

类本身只有一个启动导入的公共方法,其他方法都是私有的(因为只有类本身会使用,并且它们持有逻辑)。

我开始使用 Spock 为这个类做测试,私有方法很多,我应该如何测试呢?

我应该将它们公开进行测试吗?只测试 main 方法,public 方法?

什么是最好的?

【问题讨论】:

  • 如果您需要针对这些方法运行 JUnit 测试,它们需要是 public。这样做会导致任何问题吗?
  • 您可以将这些私有方法变成包方法(而不是公共),然后您的测试只需在同一个包中即可。
  • 我建议通读这篇 SO 帖子:stackoverflow.com/questions/105007/…
  • Spock 测试是用 Groovy 编写的,这意味着它们可以调用私有 (Java) 方法。所以这不是技术问题,只是你是否去那里的问题。
  • @Ascalonian,它会破坏封装。

标签: java unit-testing junit integration-testing spock


【解决方案1】:

理论上,您的私有方法最终会被其中一种公共方法使用,否则它们根本不会被使用。因此,通常您将测试设置为使用必要的上下文调用公共方法,以便它访问您的私有方法。

单元测试主要是测试编译单元(即类)。您可以直接对方法进行单元测试,但它们必须是公开的,这不利于拥有一个干净整洁的 API。

因此,对您的公共方法进行足够的测试以命中所有私有方法。私有方法是类的内部机制,它们不需要直接测试。

【讨论】:

  • 谢谢,我会这样测试的!
【解决方案2】:

您可以使用反射来实现这一点。 Method 类有一个名为 setAcessible(boolean) 的方法,即使声明为私有/受保护/默认,您也可以调用它。请看下面的例子:

YourClass yourClassInstance = new YourClass();
Method yourMethod = YourClass.class.getDeclaredMethod("yourMethod", null);
yourMethod.setAccessible(true);
Object[] parameters = new Object[1];
parameters[0] = "A String parameter";
Object result = yourMethod.invoke(yourClassInstance, parameters);

【讨论】:

    【解决方案3】:

    有些人认为您应该只测试您的 API(。您的公共方法)。

    一种可能的解决方案是使用包私有,这样只有同一个包中的类才能访问这些方法。

    就个人而言,我不会测试私有方法,我会专注于表现符合预期的公共方法。 如果你觉得你的私有方法太重了,那么也许它们确实如此,你应该进一步分离功能。

    【讨论】:

      【解决方案4】:

      如果你的类实现了一个接口,你可以将你喜欢测试的所有方法都“公开”,但不要将它们添加到接口中。在这种情况下,您将能够从 test 而不是从您的 src 访问这些方法。

      【讨论】:

        猜你喜欢
        • 2011-10-17
        • 2019-01-23
        • 1970-01-01
        • 2011-10-27
        • 2019-07-13
        • 2018-01-15
        • 2018-03-01
        • 1970-01-01
        • 2011-09-26
        相关资源
        最近更新 更多