11

Also habe ich den Power-Mock basierend auf dem Referenzhandbuch here eingerichtet. Mit einer einzigen Testklasse scheint alles in Ordnung zu sein. Aber wenn ich mehrere JUnit-Tests ausführe, erhalte ich den folgenden Fehler in der zweiten Testklasse.ClassCastException-Ausnahme beim Ausführen des Robolectric-Tests mit Power Mock für mehrere Dateien

Wie Sie aus dem StackTrace unten sehen können, versuche ich eine otto Bus-Instanz zu verspotten. Es schien sich richtig auf die erste Testklasse zu konzentrieren, aber auf der zweiten Klasse bekomme ich diese Klassenausnahme.

Auf dem Stacktrace bekomme ich einen Vorschlag zur Deaktivierung Objenisis Cache, aber ich bin mir nicht sicher, wie das zu erreichen und wenn das ist die eigentliche Ursache, wie ich Classloading-Xstream: 1.6.2 gemäß der Robolectric Wiki-Link angehängt über.

Die Sache ist mein Setup funktioniert gut, wenn ich eine einzelne JUnit-Testklasse ausführen, aber sobald ich versuche, alle Tests in einem Paket auszuführen, funktioniert nur der erste Test und nachfolgende Tests erhalten die Klasse Cast-Ausnahme.

org.mockito.exceptions.base.MockitoException: 
    ClassCastException occurred while creating the mockito proxy : 
     class to mock : 'com.squareup.otto.Bus', loaded by classloader : '[email protected]48d' 
     created class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]48d' 
     proxy instance class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]' 
     instance creation by : ObjenesisInstantiator 

    You might experience classloading issues, disabling the Objenesis cache *might* help (see MockitoConfiguration) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:61) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49) 
     at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24) 
     at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45) 
     at com.acme.android.myapp.services.gcm.handlers.RequestLogoutHandlerTest.setup(RequestLogoutHandlerTest.java:39) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
     at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runners.Suite.runChild(Suite.java:128) 
     at org.junit.runners.Suite.runChild(Suite.java:27) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
     at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
    Caused by: java.lang.ClassCastException: Cannot cast com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196 to com.squareup.otto.Bus 
     at java.lang.Class.cast(Class.java:3369) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:59) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49) 
     at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24) 
     at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45) 
     at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33) 
     at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59) 
     at org.mockito.Mockito.mock(Mockito.java:1285) 
     at org.mockito.Mockito.mock(Mockito.java:1163) 
     ... 36 more 


    org.mockito.exceptions.base.MockitoException: 
    ClassCastException occurred while creating the mockito proxy : 
     class to mock : 'com.squareup.otto.Bus', loaded by classloader : '[email protected]48d' 
     created class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]48d' 
     proxy instance class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : '[email protected]' 
     instance creation by : ObjenesisInstantiator 

    You might experience classloading issues, disabling the Objenesis cache *might* help (see MockitoConfiguration) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:61) 
     at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49) 
     at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24) 
     at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45) 
     at com.acme.android.myapp.services.gcm.handlers.RequestLogoutHandlerTest.setup(RequestLogoutHandlerTest.java:39) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
     at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188) 
     at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runners.Suite.runChild(Suite.java:128) 
     at org.junit.runners.Suite.runChild(Suite.java:27) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
     at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
     at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:6 

Antwort

2

So löste ich dieses Problem, indem

Zugabe
@PowerMockIgnore({ "*.*" }) 
@PrepareForTest({ StaticClass1.class,StaticClass2.class }) 

Das wird Power-Mock ignorieren alle Klassen machen. Für meinen Fall war PowerMock Classloading des Busses, der in meinem Code von Mockito verspottet wurde. Nachdem ich die obigen Anmerkungen hinzugefügt hatte, funktionierten alle Klassen in der Testsuite fehlerfrei.

+0

Dies kann in einigen Fällen funktionieren, aber ich habe Probleme bei der Durchführung dieser Tests gefunden, wenn Sie mehrere Tests verwenden, bei denen sowohl PowerMockito als auch Mockito gemischt verwendet werden. Die Kombination der Antwort mit der MockitoConfiguration-Klasse mit @PowerMockIgnore ({"org.mockito. *"}) Für meine Tests, die PowerMockito verwenden, funktioniert für mich. – jdonmoyer

15

Ich würde vorschlagen, ClassCache von Mockito zu deaktivieren, wie in der Ausnahmebedingungsnachricht vorgeschlagen. So deaktiviere ich Mockito ClassCache, indem ich eine MockitoConfiguration-Klasse in Android Studio hinzufüge.

  1. Unter Ihrem Unit-Test-Verzeichnis src/test/java, ein Paketverzeichnis erstellen, die genau die gleichen wie Mockito Konfigurationspaket, org/Mockito/Konfiguration.

  2. Fügen Sie unter dem vollständigen Testverzeichnis src/test/java/org/mockito/configuration eine neue Klasse namens MockitoConfiguration hinzu.

  3. Überschreiben Sie die Methode enableClassCache() wie folgt.

    package org.mockito.configuration; 
    
        public class MockitoConfiguration extends DefaultMockitoConfiguration { 
    
        @Override 
        public boolean enableClassCache() { 
         return false; 
        } 
    } 
    
  4. Wenn Sie Ihre Unit-Test unter src/java/Test ausführen, sollten Sie Ihre MockitoConfiguration geladen und Cache deaktiviert werden Mockito Klasse werden sollte.

Ich hoffe, es hilft.

+0

Ehrfürchtig. Vielen Dank! – Kevin

Verwandte Themen