Setting up Powemockito for static mocking

耗尽温柔 提交于 2020-03-17 08:46:47

问题


I would like to make use of Powermock with Mockito to mock some static method calls. I have followed instructions and examples from SO as well as the PowerMock Getting Started and MockStatic pages as best I can, but I am yet to complete a mockStatic() call.

When I call mockStatic(foo.class) from my test class, I'm given the excception:

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

I'm sure this is a setup problem, as I have been finding the terminology used for setting this up to be pretty confusing. I did grab the Mockito Zip from the PowerMock downloads. In Eclipse (3.5.2) I opened the project properties and added all of the Jars to the build path. I also tried adding the entire unzipped powermockito folder to my environment vars classpath, and then just the powermockito jar specifically when that didn't work out.

I have these annotationsat the class-level of my test class as well, per the powermock instructions:

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

Also these powermock-specific imports:

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

To those of you who have used PowerMockito before, even just a pointer in the right direction, or something to check would be really helpful. I'm struggling to see how my setup differs from that of posts I have seen using - from what I can tell - the same syntax.


回答1:


Probably, the versions of Powermock and Mockito are not compatible. Fix that and it won't be a n issue anymore.

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

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




回答2:


If you are using a static mock object, in your PrepareForTest annotation, add the class that is USING the static object in addition to the static class itself. If the class you are testing needs to use this static, add the current class to the annotation. You don't actually mock the class, but it needs to be in the annotation for the static to hook in. It sounds weird, but it works.

When adding multiple classes into the annotation you can have them inside {} and seperated by commas. For example if your static class is StaticA.class and the class using the static is CallerOfStatic.class you can use:

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



回答3:


Make sure powermockito and mockito versions aligned as in this chart - https://github.com/powermock/powermock/wiki/Mockito#supported-versions,

Easy way to find is,

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

In my case, powermock 1.5.6 and mockito 1.9.5 were aligned but had to change to use mockito 1.8.5, as someone else in the dependency was already using mockito 1.8.5.

Following combination perfectly works for me,

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


来源:https://stackoverflow.com/questions/19055650/setting-up-powemockito-for-static-mocking

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!