【问题标题】:surefire, PowerMock, and verifyStatic intermittent failuressurefire、PowerMock 和 verifyStatic 间歇性故障
【发布时间】:2016-02-26 01:59:59
【问题描述】:

我们使用 maven 和 surefire 2.19 进行 Junit 4.11 测试。当我们使用 IDE 或从命令行运行时,我们看不到任何失败。然而,在使用 Jenkins 时,我们的一些测试会间歇性地导致 verifyStatic 断言失败。

这是一个sn-p:

verifyStatic(times(1));
AClass.someStaticMethod(aUrl);

surefire 有时会报告:

[java] Failed tests: 
[java]   AClass.someStaticMethod:55 
[java] Wanted but not invoked AClass.someStaticMethod(
[java]     "http://foo.com/artwork.png"
[java] );
[java] Actually, there were zero interactions with this mock.

我已经厌倦了在测试中使用单线程,认为这就是我们的 IDE 正在做的事情,但这并没有帮助:

<reuseForks>false</reuseForks>
<forkCount>1</forkCount>

对可能发生的情况以及如何解决有任何建议吗?

更新:

我在此测试运行之前调用 mockStatic(AClass.class)。

另外,我已经能够通过设置一个 while 循环在命令行上重现这一点。

while [ $? -eq 0 ]; do ./mvnvm -T 8 clean && \
./mvnvm -T 8 -b multithreaded -am -Dtest=AClassTests \
-DfailIfNoTests=false -Dmaven.test.skip=false -pl MyProject test; done

最终在这个循环中我会让测试失败。现在我必须弄清楚如何在故障发生之前检测到故障并附加一个调试器。

更新 2:

我可以在 maven clean 后轻松重现此问题,似乎在 clean 后第一次运行时发生。

对不起,我撒谎了。 Thread.sleep 对此没有影响。

更新 3:

根据更新 2,Thread.sleep 无效。

Arthor,这里还有一点代码:

PowerMockito.mockStatic(ImageUtil.class);
Mockito.when(ImageUtil.getImageDetail(imageUrl)).thenReturn(detail);

ValidationCommand command = new ValidationCommand();
command.execute(validationContext);

Thread.sleep(1000);

PowerMockito.verifyStatic(times(1));
ImageUtil.getImageDetail(imageUrl);

command.execute 将在其正常执行过程中调用 ImageUtil.getImageDetail 方法。

【问题讨论】:

  • 您好!你能提供更多关于你的静态方法做什么的细节吗?它在哪里调用?你把'Thread.sleep'放在哪里了?在“验证静态”之前?还是之后?

标签: java maven jenkins powermock surefire


【解决方案1】:

在测试的开头添加以下代码:

PowerMockito.mockStatic(AClass.class);

【讨论】:

  • 感谢您的回复!我已经在调用 mockStatic。很抱歉没有包括在内。另外,我已经准备在没有詹金斯的情况下重现这个。
【解决方案2】:

不能告诉你问题到底是什么;我在将 Surefire 从 2.17 升级到 2.18 时遇到了类似的问题。

不过,我也许可以提供一种解决方法:正如 surefire documentation 中所建议的那样,我在使用 PowerMockito 的测试中添加了 @NotThreadSafe - 这对我来说是这样的。

【讨论】:

    【解决方案3】:

    不知何故,使用 powermock 的测试会遇到间歇性故障。虽然很难远离这些基于 CG lib 的模拟库,但我的团队只选择了 easymock,这在很大程度上降低了我们的工作效率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2016-10-08
      • 2011-10-27
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多