【问题标题】:Setting up Powemockito for static mocking为静态模拟设置 Powermockito
【发布时间】:2013-10-04 00:57:03
【问题描述】:

我想使用 Powermock 和 Mockito 来模拟一些静态方法调用。我已尽我所能遵循 SO 以及 PowerMock Getting StartedMockStatic 页面的说明和示例,但我还没有完成 mockStatic() 调用。

当我从我的测试类中调用 mockStatic(foo.class) 时,我得到了例外:

java.lang.NoClassDefFoundError: org/Mockito/mock/MockName
at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70)
at ...my test class method call...

我确定这是一个设置问题,因为我发现用于设置的术语非常混乱。我确实从 PowerMock downloads 中获取了 Mockito Zip。在 Eclipse (3.5.2) 中,我打开了项目属性并将所有的 Jars 添加到构建路径中。我还尝试将整个解压后的 powermockito 文件夹添加到我的环境 vars 类路径中,然后只添加 powermockito jar,特别是当这不起作用时。

根据 powermock 说明,我的测试类的类级别也有这些注释:

@RunWith(PowerMockRunner.class)
@PrepareForTest(ApplicationContextLoader.class)

还有这些特定于 powermock 的导入:

import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

对于那些以前使用过 PowerMockito 的人来说,即使只是指向正确方向的指针,或者需要检查的东西也会非常有帮助。我很难看出我的设置与我所使用的帖子的设置有何不同 - 据我所知 - 相同的语法。

【问题讨论】:

  • 您找到解决方案了吗?
  • 我不记得了,虽然已经有几年了。我得到了@Walls 的回答,所以这肯定是最有帮助的,没有解决方案。

标签: java eclipse unit-testing junit powermock


【解决方案1】:

可能是 Powermock 和 Mockito 的版本不兼容。解决这个问题,它就不再是问题了。

Mockito                     PowerMock
1.10.8+                     1.6.2+
1.9.5-rc1 - 1.9.5           1.5.0 - 1.5.6
1.9.0-rc1 & 1.9.0           1.4.10 - 1.4.12
1.8.5                       1.3.9 to 1.4.9
1.8.4                       1.3.7 & 1.3.8 
1.8.3                       1.3.6
1.8.1 & 1.8.2               1.3.5
1.8                         1.3
1.7                         1.2.5

见:https://github.com/powermock/powermock/wiki/Mockito#supported-versions

【讨论】:

【解决方案2】:

如果您使用的是静态模拟对象,请在 PrepareForTest 注释中添加使用静态对象的类以及静态类本身。如果您正在测试的类需要使用此静态,请将当前类添加到注解中。您实际上并没有模拟该类,但它需要在注解中才能挂钩静态。这听起来很奇怪,但它有效。

在注释中添加多个类时,您可以将它们放在{} 中,并用逗号分隔。例如,如果您的静态类是StaticA.class,而使用静态的类是CallerOfStatic.class,您可以使用:

@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticA.class, CallerOfStatic.class})

【讨论】:

  • 谢谢,我刚刚试了一下,让我的注释看起来像这样:@RunWith(PowerMockRunner.class) @PrepareForTest( { ApplicationContextLoader.class, TestClass.class }) public class TestClass { ..test class code... }
  • 哈哈,显然我太忙于试图让这部分变得可读了。但不,它似乎没有任何区别。
  • 我没有看到任何迹象表明它会导致问题,但您确定应该是这样吗?在MockStatic 文档中看起来不是这样
  • 我们所有的测试都有类似的问题,我不得不通过大量使用单例静态类和getInstance() 样式函数来提高我们的代码覆盖率。它困扰了我好几个星期,但它似乎奏效了。您实际上并没有模拟您添加的调用静态的类,而是提供了一个运行时挂钩,以便它知道何时从此类调用静态,我们将使用模拟对象而不是普通的静态调用。
  • @Ubunfu 如果它对您有用,请确保接受答案,这样如果将来人们遇到类似问题,他们就知道什么有效,而无需筛选 cmets :)
【解决方案3】:

确保 powermockito 和 mockito 版本与此图表一致 - https://github.com/powermock/powermock/wiki/Mockito#supported-versions

很容易找到,

mvn dependency:tree | grep mockito
[INFO] |  \- org.mockito:mockito-core:jar:1.8.5:compile
[INFO] +- org.mockito:mockito-all:jar:1.9.5:compile
[INFO] +- org.powermock:powermock-api-mockito:jar:1.5.6:compile

就我而言,powermock 1.5.6 和 mockito 1.9.5 是对齐的,但必须更改为使用 mockito 1.8.5,因为依赖项中的其他人已经在使用 mockito 1.8.5。

以下组合非常适合我,

mvn dependency:tree | grep mockito
[INFO] |  \- org.mockito:mockito-core:jar:1.8.5:compile
[INFO] +- org.mockito:mockito-all:jar:1.8.5:compile
[INFO] +- org.powermock:powermock-api-mockito:jar:1.4.9:compile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多