Używanie PowerMock i Robolectric - IncompatibleClassChangeError
Próbuję użyć PowerMockito, aby wyszydzić niektóre metody statyczne w testach Android Robolectric. Używam JUnit 4.8.2, Robolectric 2.2, Mockito 1.9.5 i PowerMock 1.9.5 zgodnie z zaleceniamitutaj. Jak muszę użyćRoboElectricTestRunner, Próbuję użyćPowerMockRule uruchomić program PowerMock. Mam jednak nieszczęściejava.lang.IncompatibleClassChangeError
kiedy test z PowerMock działa.
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Metoda natywna)
w sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) w sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) w java.lang.reflect.Method.invoke (Method.java:597)
w sun.instrument.InstrumentationImpl.loadClassAndStartAgent (InstrumentationImpl.java:323) w sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain (InstrumentationImpl.java:348)
Przyczyna: java.lang.IncompatibleClassChangeError: Klasa implementująca java.lang.ClassLoader.defineClass1 (metoda natywna)
at java.lang.ClassLoader.defineClassCond (ClassLoader.java:637) w java.lang.ClassLoader.defineClass (ClassLoader.java:621) w java.security.SecureClassLoader.defineClass (SecureClassLoader.java:141)
Jeśli to zrobięorg.ow2.asm
poorg.powermock
biblioteki, które otrzymuję:
java.lang.IncompatibleClassChangeError: klasa org.objectweb.asm.tree.ClassNode ma interfejs org.objectweb.asm.ClassVisitor jako super klasa w java.lang.ClassLoader.defineClass1 (metoda natywna) w java.lang.ClassLoader.defineClassCond (ClassLoader .java: 637) w java.lang.ClassLoader.defineClass (ClassLoader.java:621) w java.security.SecureClassLoader.defineClass (SecureClassLoader.java:141) w java.net.URLClassLoader.defineClass (URLClassLoader.java:283) w java.net.URLClassLoader.access $ 000 (URLClassLoader.java:58) w java.net.URLClassLoader $ 1.run (URLClassLoader.java:197) w java.security.AccessController.doPrivileged (metoda natywna)
nakażdy test jednostkowy.
Zgodnie z depresją Mavena: drzewo Robolectric i PowerMock nie udostępniają żadnych zależności.Ale widocznieorg.powermock: powermock-module-javaagent niektóre pakietyorg / objectweb / asm klasy i Robolectric polega naorg.ow2.asm: asm: jar: 4.1 powodując konflikt.
@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());
}
}