11

我想使用 Powermock 和 Mockito 来模拟一些静态方法调用。我已尽我所能遵循 SO 以及 PowerMock入门MockStatic页面的说明和示例,但我还没有完成 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下载中获取了 Mockito Zip 。在 Eclipse (3.5.2) 中,我打开了项目属性并将所有的 Jar 添加到构建路径中。我还尝试将整个解压缩的 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 的人来说,即使只是指向正确方向的指针,或者需要检查的东西也会非常有帮助。我很难看到我的设置与我所看到的使用相同语法的帖子有何不同 - 据我所知 - 相同的语法。

4

3 回答 3

32

可能 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

于 2014-04-15T16:36:35.223 回答
3

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

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

@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticA.class, CallerOfStatic.class})
于 2013-09-27T18:23:47.003 回答
1

确保 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

就我而言, powermock1.5.6和 mockito1.9.5是对齐的,但必须更改为 use 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
于 2016-11-02T01:58:00.503 回答