PowerMock访问私有成员

19

阅读完后: https://code.google.com/p/powermock/wiki/BypassEncapsulation 我意识到,我不太理解。

看看这个例子:

public class Bar{
   private Foo foo;

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

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

注意:
我不希望通过添加额外的get方法修改代码。

编辑:
我意识到链接页面上缺少一个包含解决方案的示例代码块。

解决方案:

 Whitebox.getInternalState(bar, "foo");

我建议在编写此类测试之前仔细考虑,不要检查私有变量的值。反对检查私有变量值的论点在此总结:https://dev59.com/MXA85IYBdhLWcg3wBOxO#7499979 - codebox
真正的测试有点复杂,涉及到Hibernate、Session和SessionFactory,我试图在不必初始化完整的Hibernate内容的情况下检查我们的dbInterface。在大多数方法中,我们修改对象的状态,并没有真正的输入/输出功能。 - Gobliins
1个回答

27

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

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)));
    }
}

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


是的,我不知怎么忽略了页面上的代码示例。你的答案是正确的。 - Gobliins
1
我喜欢“安排,执行,断言”这种注释方式。我使用“设置,测试,验证”,但是喜欢三个A的韵味。 - javaPlease42
我实际上从 S-T-V 切换到了 A-A-A。头韵确实让它听起来很好。但最重要的是(使用任何缩写):它可以帮助你构建测试,使得意外测试模拟而不是 SUT 变得更加困难。我曾经见过这种情况发生 - 因为三个阶段被混淆了。 - mthmulders
3
私有静态栏的练习答案:Foo foo = Whitebox.getInternalState(Bar.class, "foo"); 因为您可以直接通过类获取静态字段,而不是实例 :) - NullPointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接