Mockito AbstractMethodError on initMocks

Итак, я изо всех сил старался изо дня в день пытаться заставить Mockito работать в моем проекте Android. Я добавил все в файл сборки Gradle:

androidTestCompile 'org.mockito:mockito-core:2.0.29-beta'
androidTestCompile "junit:junit:4.12-beta-3"
androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'

и попробовали запустить тест, который на самом деле ничего не делает:

@RunWith(MockitoJUnitRunner.class)
public class LoginActivityTest extends 
    ActivityInstrumentationTestCase2<LoginActivity> {

    private LoginActivity loginActivity;

    private EditText et_email;
    private EditText et_password;
    private Button btn_login;

    @Mock
    SpiceManager manager;

    public LoginActivityTest(){
        super(LoginActivity.class);
    }

    @Override
    public void setUp() throws Exception {
        super.setUp();
        loginActivity = getActivity();

        MockitoAnnotations.initMocks(this);
        //manager = mock(SpiceManager.class);
        loginActivity.spiceManager = manager;

        et_email = (EditText) loginActivity.findViewById(R.id.et_email);
        et_password = (EditText) loginActivity.findViewById(R.id.et_password);
        btn_login = (Button) loginActivity.findViewById(R.id.btn_login);
    }

    @Override
    public void tearDown() throws Exception {
        super.tearDown();
    }

    public void testLoginEmpty() throws Exception {        
        verify(manager).execute(
            any(LoginRequest.class), 
            anyString(), 
            anyLong(), 
            any(LoginActivity.LoginRequestListener.class));
    }
}

Причина, по которой я хочу издеваться над сервисом, заключается в том, что я хочу, чтобы часть сети прошла тест. Нет необходимости посылать сетевой запрос на простой тест, не так ли?

Во всяком случае, приложение создается, но когда начинается фактический тест, он терпит неудачу (или, скорее, сбой) с помощью AbstractMethodError:

Running tests
Test running started
java.lang.AbstractMethodError: abstract method     
    "org.mockito.plugins.MockMaker$TypeMockability 
    org.mockito.plugins.MockMaker.isTypeMockable(java.lang.Class)"

at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:26)
at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:21)
at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:167)
at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:161)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:58)
at org.mockito.Mockito.mock(Mockito.java:1410)
at org.mockito.Mockito.mock(Mockito.java:1288)
at be.sanmax.membr.activities.LoginActivityTest.setUp(LoginActivityTest.java:50)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837)

Это выглядит как нечетное, так как класс SpiceManager не содержит методов abstract. Это, однако, часть какого-то пакета, который я не писал (com.octo.android.robospice). Но это не должно быть проблемой. Должен ли он?

И если это проблема, как я могу отказаться от факторинга из любых тестов? Я хочу проверить работу приложения, а не сетевое подключение...

Ответ 1

Dexmaker не поддерживает Mockito 2.0, так как определение MockMaker изменилось. Я предлагаю вам использовать Mockito 1.10.19, но тогда вы столкнетесь с этим NPE , для которого я отправил исправление.

Похоже, мое исправление теперь объединено с dexmaker версии 1.5

Ответ 2

Для меня это помогло использовать новейший dexmaker (и удалить все другие зависимости powermock/mockito):

    androidTestCompile 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'

Ответ 3

Mockito.initAnnotations и @RunWith являются несовместимыми друг к другу. Они оба инициализируют аннотации. Попробуйте удалить один из двух. Я предложил оставить бегуна.

Ответ 4

Используйте mockito-android вместо mockti-core для контрольно-измерительных приборов.

Ответ 5

Для меня это помогло переключиться с mockito на powerermock. Понижение mockito до 1.x дало мне нулевое исключение, обновление до 2.x дало мне AbstractMethodError. Просто включите в зависимости (вместо mockito):

testCompile "org.powermock:powermock-module-junit4:1.6.5"
testCompile "org.powermock:powermock-module-junit4-rule:1.6.5"
testCompile "org.powermock:powermock-api-mockito:1.6.5"
testCompile "org.powermock:powermock-classloading-xstream:1.6.5"