【问题标题】:PowerMock access private static membersPowerMock 访问私有静态成员
【发布时间】:2016-09-17 17:36:54
【问题描述】:

如何通过 PowerMock 访问以下私有静态字段 foo。例如,我只想验证 Foo 不为空,并且我无法通过添加 getter 来重构代码。

public class Bar{

   private static Foo foo = new Foo();


}

我尝试使用它,但它不起作用:

Foo foo = Whitebox.getInternalState(bar, "foo");

【问题讨论】:

  • 试试Whitebox.getInternalState(Bar.class, "foo")?
  • 它有效。非常感谢
  • 我注意到您尚未接受任何答案。请考虑在某个时候这样做。

标签: java junit mockito powermock


【解决方案1】:
Whitebox.getInternalState(Foo.class, "FIELD_NAME");

【讨论】:

    【解决方案2】:

    验证私有字段是否具有特定内容转化为:测试内部实现细节。当然,这是可能的,但它也会使您的测试变得非常脆弱 - 对生产代码进行轻微更改(例如:重构),您的测试就会失败;尽管您可能没有更改被测类的合同。

    你看 - 我很确定它不知何故会在你的测试类中产生差异,如果该字段是否为空。含义:对于这两种情况,您的测试类的某些行为会有所不同。

    因此我的建议是:看看您是否可以在这里避免使用 Powermock - 通过在您的生产类中找到 其他 方法来“断言”某些内容以测试该字段是否为空。

    说真的:如果该字段的内容不影响您的被测类的任何可观察到的行为 - 首先该字段的目的是什么?!

    【讨论】:

      【解决方案3】:

      您可以为此使用 Spring 的 ReflectionTestUtils.getField():

      Foo foo = ReflectionTestUtils.getField(Bar.class, "foo");
      

      【讨论】:

      • OP的问题与Spring完全无关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多