Как я могу заставить Mockito работать в androidTest

В моем тесте, как я могу издеваться над классом, который я написал?

Вот мой тестовый код:

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 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) в org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109) в org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105) в org.mockito.cglib.proxy.Enhancer. (Enhancer.java:70) в 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) at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33) в org.mockito.internal.MockitoCore.mock(MockitoCore.java:59) в org.mockito.Mockito.spy(Mockito.java:1368)

в java.lang.reflect.Method.invokeNative(собственный метод) в java.lang.reflect.Method.invoke(Method.java:515) в 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) в 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) в 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.оценка (ParentRunner.java:268) в org.junit.runners.ParentRunner.run(ParentRunner.java:363) в 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) в 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.оценка (ParentRunner.java:268) в org.junit.runners.ParentRunner.run(ParentRunner.java:363) в org.junit.runner.JUnitCore.run(JUnitCore.java:137) в org.junit.runner.JUnitCore.run(JUnitCore.java:115) в 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) at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33) в org.mockito.internal.MockitoCore.mock(MockitoCore.java:59) в org.mockito.Mockito.spy(Mockito.java:1368)

в java.lang.reflect.Method.invokeNative(собственный метод) в java.lang.reflect.Method.invoke(Method.java:515) в 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) в 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) в 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.оценка (ParentRunner.java:268) в org.junit.runners.ParentRunner.run(ParentRunner.java:363) в 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) в 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.оценка (ParentRunner.java:268) в org.junit.runners.ParentRunner.run(ParentRunner.java:363) в org.junit.runner.JUnitCore.run(JUnitCore.java:137) в org.junit.runner.JUnitCore.run(JUnitCore.java:115) в 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'
}

Ответ 1

По умолчанию Mockito использует CGLib или ByteBuddy, которые генерируют .class. Вы работаете на устройстве Android или эмуляторе, поэтому .class не помогут; Вам нужен формат .dex.

Настройте свои зависимости, чтобы использовать DexMaker, который переопределит Mockito по умолчанию и разрешит насмешки в среде Android.

Ответ 2

Начиная с версии 2.6. +, Mockito добавил новый артефакт, который работает на Android без необходимости какой-либо другой зависимости (то есть больше не нужно импортировать DexMaker). (Ссылка)

Просто используйте 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'
    ...
}