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.
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.
Tags und Links java android unit-testing junit mockito