当前位置: 首页 > 知识库问答 >
问题:

如何验证构造函数中私有方法调用的数量?

贡正诚
2023-03-14

我有以下课程:

public class LegacyClass()
{
    public LegacyClass(final int aModeOfOperation)
    {
        if (aModeOfOperation == 0)
        {
            addSomeValues();
            addSomeValues();
        }
        else if (aModeOfOperation == 1)
        {
            addSomeValues();
        }
    }

    private void addSomeValues()
    {
    }
}

我想写一个单元测试,它会检查

  1. 调用LegacyClass(0)会导致调用私有方法add某值2次,并且
  2. 调用LegacyClass(1)会导致调用一次私有方法add某值

我知道在Mockito/PowerMockito中使用间谍对象来计算私有方法调用的数量是可能的,但是AFAIK这些方法只有在测试类构建后调用所讨论的方法时才有效。

有没有可能在不改变LegacyClass的构造函数的情况下编写上面描述的单元测试?

共有2个答案

微生曾琪
2023-03-14

我认为使用mockito是不可能的,因为您以这种方式声明spyspy(new LegacyClass()),因此在监视对象之前会调用构造函数。也许有一种方法可以使用PoweverMock,但我通常不鼓励使用PowerMock,因为没有将代码重构为正确的设计。

相反,我强烈建议您将遗留代码重构为更可测试的代码(测试驱动开发是这里的关键)。

如果您绝对需要保留这个遗留代码与兼容的更改,但没有PowerMock;我将首先提高可见性级别,使包可见:

private void addSomeValues() { ... }

然后在测试中编写一个LegacyClass的静态子类,并重写将增加一个计数器调用超级的add某值方法。

public class LegacyCodeTest {
  ...

  static class AddSomeValuesCounteringLegacyClass extends LegacyClass {
    public int counter;
    void addSomeValues() { counter = counter + 1; super.addSomeValues(); }
  }
}

然后在您的测试中,您不满足这个类并断言调用计数;

华景同
2023-03-14

我认为,如果您能够执行基于状态的测试,那么您可以从单元测试中获得更好的价值(http://blog.jayfields.com/2008/02/state-based-testing.html?m=1)关于公共方法的需求/行为,而不是测试私有方法的调用次数。这在一些隔离框架中可能是可能的,但从单元测试的角度来看,我看不出有多大价值。

想想某个单元测试,你会验证一个方法已经被调用,或者一个方法已经被调用了x个数字。这些测试是验证测试,它们仍然有效。但是关键因素是大多数模拟对象框架允许您对公共方法(至少在. net中)进行这些验证。原因是从单元测试的角度来看,私有方法并不重要,因为它们是内部实现细节。尽量避免代码原理图更改的测试失败。

 类似资料:
  • 问题内容: 如何使用Hibernate验证程序来验证构造函数或方法中的参数?我希望在ValueObject创建之前进行验证,因此除非所有参数都有效,否则我可以引发异常而不创建对象。 基本上,我正在尝试使用注释,而不是尽可能执行以下操作: 我试过遵循这样的文档,虽然看起来似乎有效,但仍然会导致创建对象。 将注释添加到构造函数参数似乎无效 我如何创建对象: 验证器: 问题答案: 对于找到此帖子的其他任

  • 我想覆盖类LocalDate的toString()方法。我知道如何使用像java.util.Date这样的公共构造函数覆盖类的toString()方法: 但我不能对像java这样有私有构造函数的类做同样的事情。时间LocalDate有什么办法可以解决这个问题吗?

  • 问题内容: 对不起任何较小的语法错误或其他错误,我正在使用Jitsi模块进行此操作,并且对Java不太熟悉,因此想确认正在发生的事情以及为什么以及如何对其进行修复。 使用按名称加载类方法创建类B的实例时,应用程序正在执行此操作: 在类B中调用重写的load() 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。 这是预期的Java行为吗?是什么原因造成的?它是

  • 我有一个接口,它在两个地方定义如下: 我的客户端实现类没有任何注释,只有必需的构造函数。在这种情况下,如何限定正确的接口实现用法?我不想使用,因为在我的例子中,将其中一个用法命名为primary在语义上是不正确的(它们在某种意义上是相等的)。我需要用相同的实现类传递相同的接口,但针对受尊敬的客户机的特定用例进行了不同的配置。我想命名一个参数就足够了,通过这个参数我将实现注入到bean创建方法中,但

  • 本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问