使用powermockito操作私有字段并访问私有方法

时间:2018-10-24 12:33:01

标签: junit mockito private powermockito spy

我有一个私有布尔字段,我试图通过使用power嘲笑或使用私有设置器设置其内部状态来将其设置为true,但均不起作用。我将打印语句放入逻辑中以检查变量。我看到在我的beforeclass中将其设置为true,但是一旦测试使用私有字段命中了一条语句,它就会为false。有人可以解释我做错了什么吗?

--disable-triggers

在操作beforeclass方法中的私有字段之前和之后,在测试类中输出打印语句的控制台

SQLJConnectionBase spy = PowerMockito.spy( new SQLJConnectionBase());
System.out.println("current internal state - " + Whitebox.getInternalState(spy, "isJUnitTestCase"));
PowerMockito.doReturn(true).when(spy, "isJUnitTestCase");
Whitebox.setInternalState(spy, "isJUnitTestCase", true);
System.out.println("new internal state - " + Whitebox.getInternalState(spy, "isJUnitTestCase"));

使用private方法和private变量

在该方法中要测试的类中的打印语句的控制台输出

current internal state - false
new internal state - true
如您所见,

isJUnitTest在beforeclass中被设置为true,但是当测试用例实际使用它时,isJUnitTest为false。

这些是我在测试课程上的注释

variable state - false
method call variable state - false

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

isJUnitTestCase实际上是一个字段名称吗?看来您可能要指定setter方法名称,但是您需要为isJUnitTestCase方法设置的任何字段提供字段名称。

有关示例,请参见https://github.com/powermock/powermock/wiki/Bypass-Encapsulation

但是,如果您要在要测试的类中添加成员,则表明这不是单元测试,则您的类做错了。您不应该在真实的类中添加测试对象-还有其他方法可以让您无需添加此类钩子即可测试代码。