Mocking Static Methods with PowerMockito on Android

I am trying to disable the static method so that unit test uses the Api REST interface.

I use...

  • PowerMockito 1.5 (to enable static mockery)
  • Roboelectric 1.2 (to drown out the rest of the android)
  • JUnit 4.10

Executing the following code gives me the following error

Any idea on how to fix this?

@RunWith(RobolectricTestRunner.class) @PrepareForTest({Api.class}) public class ApiTest extends TestCase { @Rule public PowerMockRule rule = new PowerMockRule(); ... @Test public void testGet() throws Exception { Api.Response fakeResponse = PowerMockito.mock(Api.Response.class); PowerMockito.when(fakeResponse.getResult()).thenReturn(responseObj); mockStatic(Api.class); PowerMockito.when(Api.execute(any(HttpRequestBase.class))).thenReturn(fakeResponse); Api.get("/v1/contacts/"); } } 

However, a stub on static just before we call "Api.get" produces the following error ...

 java.lang.RuntimeException: java.lang.ClassNotFoundException: caught an exception while obtaining a class file for org.powermock.classloading.DeepCloner at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:68) at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:34) at org.powermock.classloading.ClassloaderExecutor.createDeepCloner(ClassloaderExecutor.java:106) at org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:88) at org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:78) at org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:49) at com.xtremelabs.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:288) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.junit.runner.JUnitCore.run(JUnitCore.java:157) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:77) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:195) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Caused by: java.lang.ClassNotFoundException: caught an exception while obtaining a class file for org.powermock.classloading.DeepCloner at javassist.Loader.findClass(Loader.java:360) at com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.findClass(RobolectricClassLoader.java:83) at javassist.Loader.loadClass(Loader.java:312) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.loadClass(RobolectricClassLoader.java:59) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:247) at org.powermock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:66) ... 24 more Caused by: com.xtremelabs.robolectric.bytecode.IgnorableClassNotFoundException: msg because of javassist.NotFoundException: org.powermock.classloading.DeepCloner at com.xtremelabs.robolectric.bytecode.AndroidTranslator.onLoad(AndroidTranslator.java:92) at javassist.Loader.findClass(Loader.java:341) ... 31 more 
+4
source share
1 answer

To have static bullying, you need to use PowerMockRunner, otherwise it will not work. See the documentation.

If possible, I always avoid static bullying due to loading complications. If you share the test code, perhaps I could suggest some workaround. Usually I create a non-stationary method inside a class that uses a static method, and I call a static method inside this non-static. Then I just spy the tested class, and I mock this method. Thus, I do not need PowerMock.

+1
source

All Articles