PowerMock方法间歇性地调用实际方法

时间:2016-03-17 00:16:07

标签: java powermock

我对PowerMock有一个非常奇怪的问题,我希望有人更熟悉它的内部结构可以建议下一个方向来追逐。

受测试的课程是泽西岛资源课程。正在测试的方法中有一个wait()语句,随后它会在Helper类上调用2个静态方法。当调用Helper类的第一个静态方法时,将执行实际方法,而不是模拟。

细微差别:

  • 如果我在等待之前调用静态方法,则返回Mocked响应。
  • 如果我在等待后两次调用静态方法,第一次将执行real方法,第二次将返回Mocked响应。
  • 如果我在等待之前调用一次静态方法,在等待之后调用5次,则wait之前的调用将返回模拟响应,wait之后的第一次调用将执行real方法,所有后续调用将返回Mocked响应
  • 如果我在IDE调试器中调试它并在方法调用上设置断点,则会返回模拟的响应。
  • 如果我注释掉wait(),那么所有内容都会按预期进行模拟。
  • 所有其他的嘲弄和诅咒以及间谍活动似乎都很好

我尝试编写一个测试存根来证明我的问题要发布在这里,但即使我不能在除原始类之外的任何内容上重现它。不幸的是,我无法发布该课程,因此我提出了盲目建议的请求。

为什么wait()会在PowerMock中造成副作用?

不确定这是否相关,但wait()是由通常设置回调的方法调用引起的。我不需要回调(不是我的测试点),所以我只是嘲笑这个方法并且没有设置回调。由于没有通知,wait()只是在指定的时间限制后返回。

在我的测试框架中,我使用的是JerseyTest 2.14(带有Grizzly容器),RestAssured 2.8.0和PowerMock 1.5.5。

1 个答案:

答案 0 :(得分:0)

不是您正在寻找的答案,但我不止一次地看到,这是任何PowerMock问题的更好答案:不要使用PowerMock。 即使是开发它的人也建议不要使用它。

当您的生产代码强制您转向PowerMock时;然后考虑更改您的生产代码。换句话说:如果您认为需要PowerMock来测试您的代码;然后大部分时间,这意味着你正在处理糟糕的设计和实施

说真的:PowerMock及其字节码操作可以打开一堆问题蠕虫。从长远来看,您最好花时间重新设计“被测系统”,以便使用合理的框架使其可测试。例如,PowerMock打破了大多数用于测量代码覆盖率的框架。今天可能不会伤害你的东西,但也许会在以后。