Mit PowerMock und Robolectric - IncompatibleClassChangeError
Ich versuche, PowerMockito zu verspotten einige statische Methoden in Android Robolectric tests. Ich bin mit JUnit 4.8.2, Robolectric 2.2, Mockito 1.9.5, und PowerMock 1.9.5, wie verwiesen hier. Als ich die RoboElectricTestRunner, ich bin versucht, PowerMockRule bootstrap PowerMock. Aber ich bin immer eine unglückliche java.lang.IncompatibleClassChangeError
wenn der test mit PowerMock läuft.
java.lang.reflektieren.InvocationTargetException
bei der sun.reflektieren.NativeMethodAccessorImpl.invoke0(Native-Methode)
bei der sun.reflektieren.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
bei der sun.reflektieren.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
bei java.lang.reflektieren.Methode.invoke(Method.java:597)
bei der sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)
bei der sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:348)Verursacht durch: java.lang.IncompatibleClassChangeError: Umsetzung Klasse
bei java.lang.ClassLoader.defineClass1(Native-Methode)
bei java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
bei java.lang.ClassLoader.defineClass(ClassLoader.java:621)
bei java.Sicherheit.SecureClassLoader.defineClass(SecureClassLoader.java:141)
Wenn ich org.ow2.asm
nach der org.powermock
Bibliotheken, die ich bekomme:
java.lang.IncompatibleClassChangeError: Klasse org.objectweb.asm.Baum.ClassNode hat interface org.objectweb.asm.ClassVisitor als super-Klasse
bei java.lang.ClassLoader.defineClass1(Native-Methode)
bei java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
bei java.lang.ClassLoader.defineClass(ClassLoader.java:621)
bei java.Sicherheit.SecureClassLoader.defineClass(SecureClassLoader.java:141)
bei java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
bei java.net.URLClassLoader.access$000(URLClassLoader.java:58)
bei java.net.URLClassLoader$1.run(URLClassLoader.java:197)
bei java.Sicherheit.AccessController.doPrivileged(Native Method)
auf jeder unit-test.
Gemäß Maven-Abhängigkeiten gelten:Baum Robolectric und PowerMock teilen nicht alle Abhängigkeiten. Aber offenbar org.powermock:powermock-Modul-javaagent Pakete einige org/objectweb/asm Klassen, und Robolectric setzt auf org.ow2.asm:asm:jar:4.1 einen Konflikt verursacht.
@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());
}
}
- Oder power-mock, Sie haben es mit power-mock-Läufer. Also, wenn Sie versuchen, führen Sie es mit Robolectric test-runner, die es nicht haben Sinn
- Das ist das problem der javaagent und
PowerMockRule
werden soll, werden die Lösung finden Sie unter PowerMockRule und PowerMockAgent. - Cool, lass mich wissen, wenn Sie es lösen, da diese auch zu einem problem für uns
- Ich werde es hier posten wenn ich es herausfinden.
- Es gibt einen StackOverflow-Frage und Problem Angemeldet. Sieht aus wie ein problem mit der Quelle.
- Was ist der status dieser?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich eine Möglichkeit zur Nutzung von PowerMock in Verbindung mit Robolectric.
Zusätzlich zu den standard-PowerMock Gläser, die PowerMock Junit Regel auch benötigt. Es ist beschrieben hier, wie Sie es packen. Ich benutzte die
xstream
zum laden von Klassen-version, weil dieobjenesis
ist sehr buggy. Dieser arbeitet mit PowerMock 1.5.5 und Robolectric 2.3, ich kann nicht sprechen über die älteren Versionen. Bitte beachten Sie auch, dass die Java-agent sollte nicht enthalten sein, denn aus meiner Erfahrung gibt es Probleme.Also, wenn Sie maven diese Abhängigkeiten erklärt werden sollte:
Dann müssen Sie zur Einrichtung Ihres test-Klasse wie folgt aus: