2016-01-17 20 views
8

Sto provando a utilizzare il framework Mockito con i test di strumentazione Android ma non posso inizializzarlo correttamente. Ho la seguente classe di test:Test di strumentazione Android con Mockito

class MainKontorTest extends ActivityInstrumentationTestCase2<MainActivity> { 

    @Mock Dependency bar; 

    @Override 
    public void setUp() { 
     super.setUp(); 
     MockitoAnnotations.initMocks(this); 
    } 

    public void testSomething() { 
     Foo foo = new Foo(bar); 
    } 
} 

Quando provo ad eseguire questo test, ho il seguente errore e stacktrace:

java.lang.ExceptionInInitializerError a org.mockito.internal.creation .cglib.ClassImposterizer.createProxyClass (ClassImposterizer.java:95) all'indirizzo org.mockito.internal.creation.cglib.ClassImposterizer.imposterise (ClassImposterizer.java:57) all'indirizzo org.mockito.internal.creation.cglib.ClassImposterizer.imposterise (ClassImposterizer.java:49) all'indirizzo org.mockito.internal.creation.cglib.Cgl ibMockMaker.createMock (CglibMockMaker.java:24) all'indirizzo org.mockito.internal.util.MockUtil.createMock (MockUtil.java:33) all'indirizzo org.mockito.internal.MockitoCore.mock (MockitoCore.java:59) presso org.mockito.Mockito.mock (Mockito.java:1285) in org.mockito.internal.configuration.MockAnnotationProcessor.process (MockAnnotationProcessor.java:33) in org.mockito.internal.configuration.MockAnnotationProcessor.process (MockAnnotationProcessor. java: 16) a org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor (DefaultAnnotationEngine.java:43) a org.mockito.internal.configuration.DefaultAnnotationEngine.process (DefaultAnnotationEngine.java:66) a org.mockito. internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations (Iniezione AnnotationEngine.java:71) a org.mockito.internal.configuration.InjectingAnnotationEngine.process (InjectingAnnotationEngine.java:55) a org.mockito.MockitoAnnotations.initMocks (MockitoAnnotations.java:108) a org.arkadiy.moduledelegationsample. ui.main.MainKontorTest.setUp (MainKontorTest.java:20) a junit.framework.TestCase.runBare (TestCase.java:132) a junit.framework.TestResult $ 1.protect (TestResult.java:115) a android .support.test.internal.runner.junit3.AndroidTestResult.runProtected (AndroidTestResult.java:77) a junit.framework.TestResult.run (TestResult.java:118) su android.support.test.internal.runner.junit3 .AndroidTestResult.run (AndroidTestResult.java:55) all'indirizzo junit.framework.TestCase.run (TestCase.ja va: 124) su android.support.test.internal.runner.junit3.NonLeakyTestSuite $ NonLeakyTest.run (NonLeakyTestSuite.java:63) all'indirizzo junit.framework.TestSuite.runTest (TestSuite.java:243) presso junit. framework.TestSuite.run (TestSuite.java:238) su android.support.test.internal.runner.junit3.DelegatingTestSuite.run (DelegatingTestSuite.java:103) su android.support.test.internal.runner.junit3. AndroidTestSuite.run (AndroidTestSuite.java:69) su android.support.test.internal.runner.junit3.JUnit38ClassRunner.run (JUnit38ClassRunner.java:90) presso org.junit.runners.Suite.runChild (Suite.java: 128) presso org.junit.runners.Suite.runChild (Suite.java:27) presso org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) su org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) su org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) su org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) presso org.junit.runners.ParentRunner $ 2.valore (ParentRunner.java:268) presso org.junit.runners.ParentRunner.run (ParentRunner.java:363) presso org.junit.runner .JUnitCore.run (JUnitCore.java:137) in org.junit.runner.JUnitCore.run (JUnitCore.java:115) su android.support.test.internal.runner.TestExecutor.execute (TestExecutor.java: 54) su android.support.test.runner.AndroidJUnitRunner.onStart (AndroidJUnitRunner.java:240) su android.app.Instrumentation $ InstrumentationThread.run (Instrumentation.java:1869) causato da: org.mockito. cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException -> null in org.mockito.cglib.core.AbstractClassGenerator.create (AbstractClassGenerator.java:238) presso org.mockito.cglib.core.KeyFactory $ Generator .create (KeyFactory.java:145) in org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:117) in org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:109) all'indirizzo org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:105) presso org.mockito.cglib.proxy.Enhancer. (Enhancer.java:70) ... 40 altro causato da: java.lang.reflect.InvocationTargetException a java.lang.reflect.Method.invoke (metodo nativo) su java.lang.reflect.Method.invoke (Method.java:372) a org.mockito.cglib.core.ReflectUtils.defineClass (ReflectUtils.java:385) a org.mockito.cglib.core.AbstractClassGenerator.create (AbstractClassGenerator.java:220) ... 45 maggiori causati da: java.lang.UnsupportedOperationException: non è possibile caricare questo tipo di file di classe a java.lang.ClassLoader.defineClass (ClassLoader.java:300) ... more 49

Come posso usare Mockito con i test di Strumentazione? Ho provato a utilizzare Mockito con il più recente Rule api ma l'errore era lo stesso.

+1

Se non si costruiscono gli APK utilizzando gradle, consultare la mia risposta su http://stackoverflow.com/questions/29290795/attempt-to-mockito-mock-any-class-generates-exceptionininitializererror/41350001#41350001 per ulteriori informazioni –

risposta

9

I mock creati da Mockito sono file di classe generati; tuttavia, Mockito è progettato per essere utilizzato in una JVM, quindi genera immediatamente file .class utilizzando cglib. I casi di test di strumentazione Android vengono eseguiti su dispositivi o emulatori, quindi hanno bisogno dei file Dalvik .dex.

È necessario assicurarsi di includere DexMaker nel classpath. Il progetto Maven dexmaker-mockito sembra avere ragione, anche se dipende da Mockito 1.10.5, che a questo punto sono alcune versioni.

Come nota a margine, a meno che non si usi Android Testing Support Library, sarà necessario utilizzare la semantica JUnit3. Non sarai in grado di utilizzare i campi @Rule o i test runner personalizzati; sarà inoltre necessario ignorare setUp e tearDown (a differenza delle annotazioni @Before e @After) e denominare i test come testFooBar (in contrasto con le annotazioni @Test).

+0

Esiste un esempio di quali annotazioni utilizzare, come definire la classe, i metodi di test, ecc.? – user1743524

+0

Se non crei i tuoi APK usando gradle, questo potrebbe non funzionare per te. Vedere la mia risposta su http://stackoverflow.com/questions/29290795/attempt-to-mockito-mock-any-class-generates-exceptionininitializererror/41350001#41350001 per ulteriori informazioni –

+0

Perché non possiamo usare ** @ Regola * * annotazioni con JUnit 4? –

Problemi correlati