Издевательские статические методы с помощью PowerMockito на Android

Я пытаюсь отключить статический метод, чтобы я мог тестировать интерфейс REST Api.

Я использую…

  • PowerMockito 1.5 (чтобы включить насмешку статики)
  • Roboelectric 1.2 (чтобы заглушить остальную часть андроида)
  • JUnit 4.10

Выполнение следующего кода дает мне следующую ошибку

Любая идея о том, что можно исправить?

@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/"); } } 

Однако заглушка на статике прямо перед тем, как мы назовем «Api.get», выдает следующую ошибку …

 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 

Чтобы иметь статичное издевательство, вы должны использовать PowerMockRunner, иначе это не сработает. См. Документацию.

Если возможно, я всегда избегаю статического издевательств из-за осложнений, связанных с загрузкой. Если вы поделитесь тестируемым кодом, возможно, я могу предложить некоторое обходное решение. Обычно я создаю нестационарный метод внутри класса, который использует статический метод, и я вызываю статический метод внутри этого нестатического. Тогда я просто делаю шпиона тестируемого класса, и я издеваюсь над этим методом. Таким образом, мне не нужен PowerMock.