使用Mockito进行Android仪器测试

Mik*_*ail 10 java junit android unit-testing mockito

我正在尝试使用Mockito框架与android仪器测试,但我无法正确初始化它.我有以下测试类:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此测试时,我收到以下错误和堆栈跟踪:

位于org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)的org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)中的java.lang.ExceptionInInitializerError.在org.mockito.internal.util.MockUtil的org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)中的mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49).在org.mockito.intern.conf.MockAnnotationProcessor的org.mockito.Mockito.mock上的org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)中的createMock(MockUtil.java:33)(Mockito.java:1285) org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)中的.process(MockAnnotationProcessor.java:33)org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:43)at org. mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEn gine.java:66)org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:71)org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:55)atg.mockito.MockitoAnnotations .initMocks(MockitoAnnotations.java:108)位于junit.framework的junit.framework.TestCase.runBare(TestCase.java:132)的org.arkadiy.moduledelegationsample.ui.main.MainKontorTest.setUp(MainKontorTest.java:20). TestResult $ 1.protect(TestResult.java:115)在android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)的junit.framework.TestResult.run(TestResult.java:118)at在android.support.test.inun.runner.junit3的junit.framework.TestCase.run(TestCase.java:124)上的android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55). 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) .junit3.AndroidTestSuite.run(AndroidTestSuite.java:69)位于org.junit.runners.Suite.runChild(Suite.java)的android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90) :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( ParentRunner.java:71)org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)org.junit.runners.ParentRunner $ 2 .在org.junit.runner.runner的org.junit.runner.JUnitCore.run(JUnitCore.java:137)的org.junit.runners.ParentRunner.run(ParentRunner.java:363)上评估(ParentRunner.java:268). JUnitCore.run(JUnitCore.java:115)在android.support.test.internal.runner.TestE xecutor.execute(TestExecutor.java:54)在android.sapp.Instrumentation上的android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240)$ 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 $ Generator.create(KeyFactory.java:145)位于org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)的org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)org .mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)at org.mockito.cglib.proxy.Enhancer.(Enhancer.java:70)... 40更多引起:java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method),位于org.mockito.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:385)的java.lang.reflect.Method.invoke(Method.java:372)在org.mockito.cglib.cor e.AbstractClassGenerator.create(AbstractClassGenerator.java:220)... 45更多引起:java.lang.UnsupportedOperationException:无法在java.lang.ClassLoader.defineClass(ClassLoader.java:300)中加载此类类文件......还有49个

如何使用Mockito进行仪器测试?我尝试过使用Mockito和更新的规则api,但错误是一样的.

Jef*_*ica 14

Mockito创建的模拟是生成类文件; 但是,Mockito设计用于JVM,因此开箱即用它可以生成.class文件cglib.Android Instrumentation测试用例在设备或模拟器上运行,因此需要Dalvik .dex文件.

您需要确保在类路径中包含DexMaker.该dexmaker-的Mockito Maven项目似乎是对的,尽管它取决于1.10.5的Mockito,这是几个版本落后于这一点.

另外,除非您使用Android测试支持库,否则您将需要使用JUnit3语义.您将无法使用@Rule字段或自定义测试运行器; 您还需要覆盖setUptearDown(而不是@Before@After注释)并将测试命名为testFooBar(与@Test注释相对).