设置Powermockito进行静态模拟

时间:2013-09-27 16:22:34

标签: java eclipse unit-testing junit powermock

我想利用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的人来说,即使是指向正确方向的指针,或者要检查的东西也会非常有用。我很难看到我的设置与我见过的帖子有什么不同 - 从我能说的 - 与语法相同。

3 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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