【问题标题】:EasyMock expecting private method callsEasyMock 期待私有方法调用
【发布时间】:2012-08-06 18:38:35
【问题描述】:

假设我有一个看起来像这样的方法:

public static String[] parseFoo(Foo anObject){
    Foo anotherObject = parseFoo2(anObject);
...
}

private static Foo parseFoo2(Foo anObject){
...
}

并且这两个方法都在同一个类中。 parseFoo2 只是一个帮助 parseFoo 完成一些工作的辅助方法。我正在尝试测试方法 parseFoo。 EasyMock 中是否有人可以为 parseFoo2 指定私有方法调用的返回值,就像我可以使用

为对象指定实例方法调用一样
EasyMock.createMock(...);
anObject.expect(...).andReturn(...);

因为我想测试公共方法,但我不想进入私有方法并测试里面的实现。

谢谢

【问题讨论】:

    标签: java unit-testing easymock


    【解决方案1】:

    不要这样做。 一个好的单元测试的基石之一是它应该尽可能少地依赖于实现细节。模拟一个 private 方法就是这样。

    为什么? 因为这会使您的单元测试非常脆弱。考虑一下您在一周后返回此代码并确定您实际上并不需要方法 parseFoo2 并且您实际上想要内联其代码的情况。或者您想将此方法拆分为两个或多个较小的方法。所有非常有效的重构实践 - 但它们会破坏单元测试!

    您不希望每次进行这样的简单重构时都进行单元测试。因此,模拟私有方法被认为是不好的做法。

    【讨论】:

    • 这个答案太绝对主义了,从哲学角度来看,私有方法没有应该测试的内部契约。如果该方法在类中的多个地方使用,它就像一个公共方法一样,需要维护它的行为模式。此外,如果您有一个方法调用多个方法(全部为私有),每个方法都有 2-3 个逻辑路径,测试顶级方法变得非常复杂。没有什么比在您需要签入时失败的复杂测试更糟糕的了:)。比起偶尔遇到的障碍,我更喜欢频繁的可预测成本。
    • @Gus,我不同意。从实用的角度来看,以高粒度测试私有方法会阻止您轻松重构代码。我同意随着复杂性的增加,它应该被分解成应该单独测试的部分。在这种情况下应考虑类。从哲学的角度来看,我认为类的私有部分不是应该测试的单元。这是一个实现细节,而测试应该反映被测对象的需求,而不是其内部工作。
    • 我同意有时您需要模拟私有方法 - 例如,在内部(私有)逻辑的模拟非常复杂并且错过了测试重点的情况下。但这些情况相对较少,通常指向另一个设计流程。无论如何,它不属于 OP 的用例。
    【解决方案2】:

    如果你发现你必须模拟出一个私有方法,那么你可以使用PowerMock.expectPrivate()。 EasyMock 不能模拟私有方法。

    【讨论】:

      【解决方案3】:

      如果您仍想使用 EasyMock,因为更改它不取决于您(在企业中工作),您可以使用反射来更改您的方法返回的私有字段,或任何私有字段。

      例如,您可以在帮助程序类中使用这些方法。并根据需要使用它们。

      【讨论】:

      • 你有没有让这个工作?到目前为止,我已经尝试了好几次都没有运气。
      • 在我的情况下 parseFoo2 在另一个类中,但我需要修改它返回的内容,最后是该类的私有静态字段吗?所以.. public static void helpMethodForStaticFiled(Class>类,字符串字段名,对象字段值){ 字段字段 = class.getDeclaredField(fieldName); field.setAccessible(true); field.set(null, fieldValue); field.setAccessible(false);现在,如果我在 MyClass 类中有一个私有静态 MyField myField,我会执行以下操作:helpMethodForStaticFiled(MyClass.class, "myField", new MyField());
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      相关资源
      最近更新 更多