【问题标题】:PowerMock access private membersPowerMock 访问私有成员
【发布时间】:2015-01-19 14:57:05
【问题描述】:

阅读后: https://code.google.com/p/powermock/wiki/BypassEncapsulation 我意识到了,我不明白。

参见本例:

public class Bar{
   private Foo foo;

   public void initFoo(){
       foo = new Foo();
   }
}

如何使用 PowerMock 访问私有成员 foo(例如验证 foo 不为空)?

注意:
我不想要的是用额外的getmethods 修改代码。

编辑:
我意识到我错过了解决方案链接页面上的示例代码块。

解决方案:

 Whitebox.getInternalState(bar, "foo");

【问题讨论】:

  • 我建议在编写这种类型的测试之前仔细考虑,反对检查私有变量值的论据总结在这里:stackoverflow.com/questions/2981476/…
  • 真正的测试有点复杂,涉及休眠、会话和会话工厂,我尝试检查我们的dbInterface,而不必初始化完整的休眠内容。在大多数方法中,我们修改对象状态并且没有真正的输入/输出功能。

标签: java junit mockito private powermock


【解决方案1】:

这应该像编写以下测试类一样简单:

public class BarTest {
    @Test
    public void testFooIsInitializedProperly() throws Exception {
        // Arrange
        Bar bar = new Bar();

        // Act
        bar.initFoo();

        // Assert
        Foo foo = Whitebox.getInternalState(bar, "foo");
        assertThat(foo, is(notNull(Foo.class)));
    }
}

添加正确的(静态)导入作为练习留给读者:)。

【讨论】:

  • 是的,我不知何故忽略了页面上的代码示例。你的答案是正确的
  • 我喜欢“安排、行动、断言”cmets。我使用“设置、测试、验证”,但喜欢 3 As 的戒指。
  • 我实际上是从 S-T-V 切换到 A-A-A。头韵确实使它听起来不错。但最重要的是(使用任一缩写):它可以帮助您构建测试结构,从而更难意外地测试您的模拟而不是 SUT。我已经看到这种情况发生了 - 由于三个阶段混合在一起。
  • 私有静态栏练习答案:Foo foo = Whitebox.getInternalState(Bar.class, "foo");因为你可以直接通过类而不是实例获取静态字段:)
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多