与Mockito的Android仪器testing

我试图使用Android仪器testingMockito框架,但我不能正确初始化它。 我有以下testing类:

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); } } 

当我尝试运行这个testing时,我得到以下错误和stacktrace:

java.lang.ExceptionInInitializerError 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.CglibMockMaker.createMock(CglibMockMaker.java:24)at org.mockito.internal.util.MockUtil。在org.mockito.internal.MockAnnotationProcessor的org.mockito.Mockito.Mock(Mockito.java:1285)上的org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)上的createMock(MockUtil.java:33) (org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:43)org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)处理(MockAnnotationProcessor.java:33)。 mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEn (org.mockito.java:66)org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:71)org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:55)at org.mockito.MockitoAnnotations .initMocks(MockitoAnnotations.java:108)at junit.framework.TestCase.runBare(TestCase.java:132)at junit.framework。org.arkadiy.moduledeleationsample.ui.main.MainKontorTest.setUp(MainKontorTest.java:20)。 TestResult $ 1.protect(TestResult.java:115)at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)at junit.framework.TestResult.run(TestResult.java:118)at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55),位于android.support.test.internal.runner.junit3的junit.framework.TestCase.run(TestCase.java:124)。 NonLeakyTestSuite $ NonLeakyTest.run(NonLeakyTestSuite.java:63)在junit.framework.TestSuite.runTest(TestSuite.java:24 3)在android.support.test.internal.runner的android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)上的junit.framework.TestSuite.run(TestSuite.java:238) .org.junit.runners.Suite.runChild(Suite.java)中的。 :128)org.junit.runners.Suite.runChild(Suite.java:27)org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner $ 1.schedule(在Org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)org.junit.runners.ParentRunner $ 2上的ParentRunner.java:71) .evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at org.junit.runner。 JUnitCore.run(JUnitCore.java:115)在android.support.test.internal.runner.TestE xecutor.execute(TestExecutor.java:54)在android.app.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240)在android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1869)引起:org .mockito.cglib.core.CodeGenerationException:java.lang.reflect.InvocationTargetException – > null在org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:238)at org.mockito.cglib.core.KeyFactory $在org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)org.mockito.cglib.core.Java:109上的Generator.create(KeyFactory.java:145) .mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)org.mockito.cglib.proxy.Enhancer。(Enhancer.java:70)… 40更多引起:java.lang.reflect.InvocationTargetException java.lang.reflect.Method.invoke(Method.java:372)at org.mockito.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:385)在org.mockito.cglib.cor e.AbstractClassGenerator.create(AbstractClassGenerator.java:220)… 45 more引起java.lang.UnsupportedOperationException:无法在java.lang.ClassLoader.defineClass(ClassLoader.java:300)中加载此types的文件。 … 49更多

我如何在仪器testing中使用Mockito? 我已经尝试使用更新的规则api Mockito,但错误是一样的。

Solutions Collecting From Web of "与Mockito的Android仪器testing"

Mockito创build的模拟是生成类文件; 然而,Mockito是为在JVM中使用而devise的,所以开箱即用cglib生成.class文件。 Android Instrumentationtesting用例在设备或模拟器上运行,因此需要使用Dalvik .dex文件。

你需要确保你的类path中包含了DexMaker 。 dexmaker-mockito Maven项目似乎是正确的,虽然它取决于Mockito 1.10.5,这是现在的一些版本。

另外,除非您使用Androidtesting支持库 ,否则您将需要使用JUnit3语义。 您将无法使用@Rule字段或自定义testing运行程序; 你还需要重写setUptearDown (而不是@Before@After注释),并将testing命名为testFooBar (而不是@Test注释)。