Android Instrumententests mit Mockito [duplizieren]

8

Ich versuche das Mockito-Framework mit Android-Instrumentierungstests zu verwenden, aber ich kann es nicht richtig initialisieren. Ich habe folgende Testklasse:

%Vor%

Wenn ich versuche, diesen Test auszuführen, erhalte ich den folgenden Fehler und Stacktrace:

  

java.lang.ExceptionInInitializerError   unter org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass (ClassImposterizer.java:95)   bei org.mockito.internal.creation.cglib.ClassImposterizer.imposterise (ClassImposterizer.java:57)   bei org.mockito.internal.creation.cglib.ClassImposterizer.imposterise (ClassImposterizer.java:49)   bei org.mockito.internal.creation.cglib.CglibMockMaker.createMock (CglibMockMaker.java:24)   bei org.mockito.internal.util.MockUtil.createMock (MockUtil.java:33)   bei org.mockito.internal.MockitoCore.mock (MockitoCore.java:59)   bei org.mockito.Mockito.mock (Mockito.java:1285)   bei org.mockito.internal.configuration.MockAnnotationProcessor.process (MockAnnotationProcessor.java:33)   bei org.mockito.internal.configuration.MockAnnotationProcessor.process (MockAnnotationProcessor.java:16)   bei org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor (DefaultAnnotationEngine.java:43)   bei org.mockito.internal.configuration.DefaultAnnotationEngine.process (DefaultAnnotationEngine.java:66)   bei org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations (InjectingAnnotationEngine.java:71)   bei org.mockito.internal.configuration.InjectingAnnotationEngine.process (InjectingAnnotationEngine.java:55)   bei org.mockito.MockitoAnnotations.initMocks (MockitoAnnotations.java:108)   bei org.arkadiy.moduledelegationsample.ui.main.MainKontorTest.setUp (MainKontorTest.java:20)   bei junit.framework.TestCase.runBare (TestCase.java:132)   bei junit.framework.TestResult $ 1.protect (TestResult.java:115)   bei android.support.test.internal.runner.junit3.AndroidTestResult.runProtected (AndroidTestResult.java:77)   bei junit.framework.TestResult.run (TestResult.java:118)   bei android.support.test.internal.runner.junit3.AndroidTestResult.run (AndroidTestResult.java:55)   bei junit.framework.TestCase.run (TestCase.java:124)   bei android.support.test.internal.runner.junit3.NonLeakyTestSuite $ NonLeakyTest.run (NonLeakyTestSuite.java:63)   bei junit.framework.TestSuite.runTest (TestSuite.java:243)   bei junit.framework.TestSuite.run (TestSuite.java:238)   bei android.support.test.internal.runner.junit3.DelegatingTestSuite.run (DelegatingTestSuite.java:103)   bei android.support.test.internal.runner.junit3.AndroidTestSuite.run (AndroidTestSuite.java:69)   bei android.support.test.internal.runner.junit3.JUnit38ClassRunner.run (JUnit38ClassRunner.java:90)   bei org.junit.runners.Suite.runChild (Suite.java:128)   bei org.junit.runners.Suite.runChild (Suite.java:27)   bei org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290)   bei org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71)   bei org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288)   bei org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58)   bei org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268)   bei org.junit.runners.ParentRunner.run (ParentRunner.java:363)   bei org.junit.runner.JUnitCore.run (JUnitCore.java:137)   bei org.junit.runner.JUnitCore.run (JUnitCore.java:115)   bei android.support.test.internal.runner.TestExecutor.execute (TestExecutor.java:54)   bei android.support.test.runner.AndroidJUnitRunner.onStart (AndroidJUnitRunner.java:240)   bei android.app.Instrumentation $ InstrumentationThread.run (Instrumentation.java:1869)   Verursacht von: org.mockito.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException - & gt; null   bei org.mockito.cglib.core.AbstractClassGenerator.create (AbstractClassGenerator.java:238)   bei org.mockito.cglib.core.KeyFactory $ Generator.create (KeyFactory.java:145)   bei org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:117)   bei org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:109)   bei org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:105)   bei org.mockito.cglib.proxy.Enhancer. (Enhancer.java:70)   ... 40 mehr   Verursacht von: java.lang.reflect.InvocationTargetException   bei java.lang.reflect.Method.invoke (native Methode)   bei java.lang.reflect.Method.invoke (Methode.java:372)   bei org.mockito.cglib.core.ReflectUtils.defineClass (ReflectUtils.java:385)   bei org.mockito.cglib.core.AbstractClassGenerator.create (AbstractClassGenerator.java:220)   ... 45 mehr   Verursacht von: java.lang.UnsupportedOperationException: Dieser Typ von Klassendatei kann nicht geladen werden   bei java.lang.ClassLoader.defineClass (ClassLoader.java:300)   ... 49 mehr

Wie kann ich Mockito mit Instrumentierungstests verwenden? Ich habe versucht, Mockito mit neueren Rule api zu verwenden Der Fehler war der gleiche.

    
Mikhail 17.01.2016, 20:26
quelle

1 Antwort

9

Die von Mockito erzeugten Mocks sind generierte Klassendateien. Mockito wurde jedoch für die Verwendung in einer JVM entwickelt, sodass es standardmäßig .class -Dateien mit cglib generiert. Android Instrumentation-Testfälle werden auf Geräten oder Emulatoren ausgeführt, daher benötigen sie Dalvik .dex -Dateien.

Sie müssen sicherstellen, dass Sie DexMaker in Ihren Klassenpfad aufnehmen. Das dexmaker-mockito Maven Projekt scheint richtig zu sein, Allerdings kommt es auf Mockito 1.10.5 an, was an dieser Stelle ein paar Versionen zurück gibt.

Als Nebenbemerkung, wenn Sie nicht die Android Testing Support Library verwenden muss JUnit3 Semantik verwenden. Sie können @Rule Felder oder benutzerdefinierte Testläufer nicht verwenden; Außerdem müssen Sie setUp und tearDown (im Gegensatz zu @Before und @After Annotationen) überschreiben und Ihre Tests als testFooBar (im Gegensatz zu @Test Annotationen) benennen.

    
Jeff Bowman 20.01.2016, 19:02
quelle