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?

InformationsquelleAutor C. Ross | 2013-12-13
Schreibe einen Kommentar