Использование PowerMock и Robolectric - IncompatibleClassChangeError
Я пытаюсь использовать PowerMockito для макетирования некоторых статических методов в тестах Android Robolectric. Я использую JUnit 4.8.2, Robolectric 2.2, Mockito 1.9.5 и PowerMock 1.9.5, как указаноВот, Как я должен использоватьRoboElectricTestRunnerЯ пытаюсь использоватьPowerMockRule загрузить PowerMock. Однако я получаю несчастныйjava.lang.IncompatibleClassChangeError
когда тест с PowerMock запускается.
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) в java.lang.hoj.jj
в sun.instrument.InstrumentationImpl.loadClassAndStartAgent (InstrumentationImpl.java:323) в sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain (InstrumentationImpl.java:348)
Вызвано: java.lang.IncompatibleClassChangeError: Реализация класса в java.lang.ClassLoader.defineClass1 (собственный метод)
в java.lang.ClassLoader.defineClassCond (ClassLoader.java:637) в java.lang.ClassLoader.defineClass (ClassLoader.java:621) в java.security.SecureClassLoader.defineClass (SecureClassLoader.java:14)
Если я поставлюorg.ow2.asm
послеorg.powermock
библиотеки, которые я получаю:
java.lang.IncompatibleClassChangeError: класс org.objectweb.asm.tree.ClassNode имеет интерфейс org.objectweb.asm.ClassVisitor в качестве суперкласса в java.lang.ClassLoader.defineClass1 (собственный метод) в java.lang.ClassLoaderClassCoader .java: 637) в java.lang.ClassLoader.defineClass (ClassLoader.java:621) в java.security.SecureClassLoader.defineClass (SecureClassLoader.java:141) в java.net.URLClassLoader.defineClass (URLClassL283) на java.net.URLClassLoader.access $ 000 (URLClassLoader.java:58) на java.net.URLClassLoader $ 1.run (URLClassLoader.java:197) на java.security.AccessController.doPrivileged (собственный метод)
накаждый модульный тест.
Согласно зависимости Maven: дерево Robolectric и PowerMock не имеют общих зависимостей.Но по всей видимостиorg.powermock: powermock-модуль-javaagent пакеты некоторыеорг / ObjectWeb / ASM классы, и Robolectric опирается наorg.ow2.asm: ASM: баночка: 4,1 вызывая конфликт.
@RunWith(RobolectricTestRunner.class)
@PrepareForTest(Helper.class)
@PowerMockIgnore({"com.sun.jmx.*", "javax.management.*"})
public class HelpFragTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
static {
PowerMockAgent.initializeIfNeeded();
}
FragmentActivity fragmentActivity;
FragmentManager fragmentManager;
ActionBarManager actionBarManager;
@Before
public void setup(){
actionBarManager = mock(ActionBarManager.class);
LowesApplication.instance().setActionBarManager(actionBarManager);
fragmentActivity = Robolectric.buildActivity(FragmentActivity.class).create().start().resume().get();
fragmentManager = fragmentActivity.getSupportFragmentManager();
}
@Test
public void testShow(){
mockStatic(Helper.class);
HelpFrag helpFrag = HelpFrag.newInstance();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(helpFrag, null);
fragmentTransaction.commit();
assertTrue(helpFrag.isVisible());
}
}