2016-01-17 13 views
8

Próbuję użyć ram Mockito z testami oprzyrządowania Android, ale nie mogę zainicjować go prawidłowo. Mam następujące klasy badawczej:Testy aparatury Android z 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); 
    } 
} 

Kiedy próbuję uruchomić ten test, otrzymuję następujący błąd i StackTrace:

java.lang.ExceptionInInitializerError na org.mockito.internal.creation .cglib.ClassImposterizer.createProxyClass (ClassImposterizer.java:95) at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise (ClassImposterizer.java:57) at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise (ClassImposterizer.java:49) at org.mockito.internal.creation.cglib.Cgl ibMockMaker.createMock (CglibMockMaker.java:24) w org.mockito.internal.util.MockUtil.createMock (MockUtil.java:33) w org.mockito.internal.MockitoCore.mock (MockitoCore.java:59) at org.mockito.Mockito.mock (Mockito.java:1285) w org.mockito.internal.configuration.MockAnnotationProcessor.process (MockAnnotationProcessor.java:33) w org.mockito.internal.configuration.MockAnnotationProcessor.process (MockAnnotationProcessor. Java 16) w org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor (DefaultAnnotationEngine.java:43) w org.mockito.internal.configuration.DefaultAnnotationEngine.process (DefaultAnnotationEngine.java:66) w org.mockito. internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations (Injecting AnnotationEngine.java:71) w org.mockito.internal.configuration.InjectingAnnotationEngine.process (InjectingAnnotationEngine.java:55) w org.mockito.MockitoAnnotations.initMocks (MockitoAnnotations.java:108) w org.arkadiy.moduledelegationsample. ui.main.MainKontorTest.setUp (MainKontorTest.java:20) na junit.framework.TestCase.runBare (TestCase.java:132) na junit.framework.TestResult $ 1.protect (TestResult.java:115) na Androidzie .support.test.internal.runner.junit3.AndroidTestResult.runProtected (AndroidTestResult.java:77) na junit.framework.TestResult.run (TestResult.java:118) na android.support.test.internal.runner.junit3 .AndroidTestResult.run (AndroidTestResult.java:55) na junit.framework.TestCase.run (TestCase.ja va: 124) na android.support.test.internal.runner.junit3.NonLeakyTestSuite $ NonLeakyTest.run (NonLeakyTestSuite.java:63) w junit.framework.TestSuite.runTest (TestSuite.java:243) w JUnit. framework.TestSuite.run (TestSuite.java:238) na android.support.test.internal.runner.junit3.DelegatingTestSuite.run (DelegatingTestSuite.java:103) na android.support.test.internal.runner.junit3. AndroidTestSuite.run (AndroidTestSuite.java:69) na android.support.test.internal.runner.junit3.JUnit38ClassRunner.run (JUnit38ClassRunner.java:90) at org.junit.runners.Suite.runChild (Suite.java: 128) w org.junit.runners.Suite.runChild (Suite.java:27) w org.junit.runners.ParentRunner 3,95 USD (ParentRunner.java:290) at org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) w org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) w org.junit.runners.ParentRunner.access 000 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) w org.junit.runner.JUnitCore.run (JUnitCore.java:115) na android.support.test.internal.runner.TestExecutor.execute (TestExecutor.java: 54) na android.support.test.runner.AndroidJUnitRunner.onStart (AndroidJUnitRunner.java:240) at android.app.Instrumentation $ InstrumentationThread.run (Instrumentation.java:1869) Spowodowane przez: org.mockito. cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException -> null at org.mockito.cglib.core.AbstractClassGenerator.create (AbstractClassGenerator.java:238) w org.mockito.cglib.core.KeyFactory $ Generator .create (KeyFactory.java:145) at org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:117) at org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:109) at org.mockito.cglib.core.KeyFactory.create (KeyFactory.java:105) w org.mockito.cglib.proxy.Enhancer. (Enhancer.java:70) ... 40 więcej Spowodowany przez: java.lang.reflect.InvocationTargetException na java.lang.reflect.Method.invoke (metoda podstawowa) na java.lang.reflect.Method.invoke (Method.java:372) na org.mockito.cglib.core.ReflectUtils.defineClass (ReflectUtils.java:385) w org.mockito.cglib.core.AbstractClassGenerator.create (AbstractClassGenerator.java:220) ... 45 więcej Spowodowany przez: java.lang.UnsupportedOperationException: nie można załadować tego typu klasy pliku na java.lang.ClassLoader.defineClass (ClassLoader.java:300) ... 49 więcej

Jak czy mogę korzystać z testów Mockito z oprzyrządowaniem? Próbowałem używać Mockito z nowszym Rule api, ale błąd był taki sam.

+1

Jeśli nie tworzysz plików APK przy użyciu gradle, zobacz moją odpowiedź na http://stackoverflow.com/questions/29290795/attempt-to-mockito-mock-any-class-generates-exceptionininitializererror/41350001#41350001 dla więcej informacji –

Odpowiedz

9

Kary, które tworzy Mockito, to wygenerowane pliki klas; jednakże Mockito jest przeznaczony do użycia w JVM, więc po wyjęciu z pudełka generuje pliki .class przy użyciu cglib. Testy urządzeń Android Instrumentation działają na urządzeniach lub emulatorach, więc potrzebują plików Dalvik .dex.

Musisz się upewnić, że w swojej ścieżce klasowej znajduje się DexMaker. Wydaje się, że projekt Maven dexmaker-mockito ma rację, choć zależy to od Mockito 1.10.5, który jest w tym momencie kilkoma wersjami.

Na marginesie, jeśli nie używasz Android Testing Support Library, musisz użyć semantyki JUnit3. Nie będzie można korzystać z pól @Rule ani niestandardowych biegaczy testowych; będziesz także musiał zastąpić setUp i tearDown (w przeciwieństwie do adnotacji @Before i @After) i nazwać twoje testy jako testFooBar (w przeciwieństwie do adnotacji @Test).

+0

Czy istnieje przykład adnotacji do użycia, jak zdefiniować klasę, metody testowania itp.? – user1743524

+0

Jeśli nie zbudujesz plików APK przy użyciu gradle, może to nie działać. Zobacz moją odpowiedź na http://stackoverflow.com/questions/29290795/attempt-to-mockito-mock-any-class-generates-exceptionininitializererror/41350001#41350001, aby uzyskać więcej informacji. –

+0

Dlaczego nie możemy użyć ** @ Rule * * adnotacje z JUnit 4? –