如何让Mockito在androidTest

时间:2015-08-11 17:07:48

标签: android unit-testing mockito

在我的测试中,我如何模拟我写的课程?

这是我的测试代码:

import android.support.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

@RunWith(AndroidJUnit4.class)
public class SampleTest {
    @Mock
    Sample mySample;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void shouldMockSample() {
        verify(mySample, never()).neverCallMe();
    }

}

示例只是一个虚拟类。

public class Sample {

    public void neverCallMe() {}
}

如何摆脱此错误?

  

java.lang.VerifyError:org / mockito / cglib / core / ReflectUtils at at   org.mockito.cglib.core.KeyFactory $ Generator.generateClass(KeyFactory.java:167)   在   org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)   在   org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)   在   org.mockito.cglib.core.KeyFactory $ Generator.create(KeyFactory.java:145)   在org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)at   org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)at at   org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)at at   org.mockito.cglib.proxy.Enhancer。(Enhancer.java:70)at   org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)   在   org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)   在   org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)   在   org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)   在org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)at   org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)at   org.mockito.Mockito.spy(Mockito.java:1368)

     

at java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:515)at   org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)   在   org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)   在   org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)   在   org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)   在   org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)   在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)   在   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)   在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)at at   org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)at at   org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at at   org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)at at   org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)at at   org.junit.runners.ParentRunner.run(ParentRunner.java:363)at at   org.junit.runners.Suite.runChild(Suite.java:128)at   org.junit.runners.Suite.runChild(Suite.java:27)at   org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)at   org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)at at   org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at at   org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)at at   org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)at at   org.junit.runners.ParentRunner.run(ParentRunner.java:363)at at   org.junit.runner.JUnitCore.run(JUnitCore.java:137)at at   org.junit.runner.JUnitCore.run(JUnitCore.java:115)at at   android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54)   在   android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:228)   在   android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1741)

     

java.lang.NoClassDefFoundError:   org / mockito / internal / creation / cglib / ClassImposterizer $ 3 at   org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)   在   org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)   在   org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)   在   org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)   在org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)at   org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)at   org.mockito.Mockito.spy(Mockito.java:1368)

     

at java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:515)at   org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)   在   org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)   在   org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)   在   org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)   在   org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)   在org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)   在   org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)   在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)at at   org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)at at   org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at at   org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)at at   org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)at at   org.junit.runners.ParentRunner.run(ParentRunner.java:363)at at   org.junit.runners.Suite.runChild(Suite.java:128)at   org.junit.runners.Suite.runChild(Suite.java:27)at   org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)at   org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)at at   org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at at   org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)at at   org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)at at   org.junit.runners.ParentRunner.run(ParentRunner.java:363)at at   org.junit.runner.JUnitCore.run(JUnitCore.java:137)at at   org.junit.runner.JUnitCore.run(JUnitCore.java:115)at at   android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54)   在   android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:228)   在   android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1741)

我在gradle文件中使用以下依赖项:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
    androidTestCompile 'com.android.support:support-annotations:22.2.1'
    androidTestCompile 'org.mockito:mockito-core:1.10.19'
    androidTestCompile 'org.objenesis:objenesis:2.1'
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
    androidTestCompile 'com.android.support.test:runner:0.3'
    androidTestCompile 'com.android.support.test:rules:0.3'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
    testCompile 'org.mockito:mockito-core:1.10.19'
    testCompile 'org.hamcrest:hamcrest-library:1.3'
    testCompile 'junit:junit:4.12'
    testCompile 'org.robolectric:robolectric:3.0'
}

2 个答案:

答案 0 :(得分:22)

从版本2.6。+开始,Mockito添加了一个适用于Android的新工件,无需任何其他依赖(即不再需要导入DexMaker)。 (Reference)

只需使用org.mockito:mockito-android作为已检测单元测试的依赖项(androidTest)。您仍然可以使用通常的org.mockito:mockito-core进行本地单元测试。

示例:

dependencies {
    ...
    testCompile 'org.mockito:mockito-core:2.7.15'
    androidTestCompile 'org.mockito:mockito-android:2.7.15'
    ...
}

答案 1 :(得分:13)

默认情况下,Mockito使用CGLib或ByteBuddy,两者都生成.class个文件。您已在Android设备或模拟器上运行,因此.class文件无法提供帮助;你需要.dex格式。

调整您的依赖关系以使用DexMaker,这将覆盖Mockito的默认设置并允许在Android环境中进行模拟。