it-swarm.com.ru

ошибка инициализации mockito, каждый раз и для любых тестовых случаев

Почти весь день боролся с этим. Неважно, какие тесты/класс/интерфейс я использую, я получаю почти то же исключение. Вот стакеррор:

Java.lang.AbstractMethodError: org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.isTypeMockable(Ljava/lang/Class;)Lorg/mockito/plugins/MockMaker$TypeMockability;
    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.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.Java:33)
    at org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.Java:16)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.Java:43)
    at org.mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEngine.Java:66)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.Java:71)
    at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.Java:55)
    at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.Java:108)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl$1.withBefores(JUnit45AndHigherRunnerImpl.Java:27)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.Java:246)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:300)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.Java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.Java:62)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.Java:86)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.Java:49)
    at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.Java:69)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.Java:50)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:24)
    at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.Java:32)
    at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.Java:93)
    at com.Sun.proxy.$Proxy2.processTestClass(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.Java:105)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:35)
    at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.Java:24)
    at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.Java:355)
    at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.Java:64)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
    at Java.lang.Thread.run(Thread.Java:745)

Infact, я даже не понимаю, почему библиотека Powermock участвует. Это скомпилировано, когда я пытался высмеять некоторые последние занятия, но это было несколько часов назад!

Вот фактический набор файлов, которые я пытаюсь использовать:

public class ClassA {

    private String message;

    public String getMessage(){

        message="classA";
        return message;

    }
}

public class ClassB {

    private ClassA myClass;

    public ClassB(ClassA aClass){
        this.myClass=aClass;
    }

    public ClassA getClassA(){
        return myClass;
    }
}

и класс тестирования:

package com.icidigital.services

import com.icidigital.users.ClassA
import com.icidigital.users.ClassB
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.runners.MockitoJUnitRunner
/**
 * Created by apil.tamang on 7/28/15.
 */
@RunWith(MockitoJUnitRunner.class)
class TestSimplestMock {

    ClassB classB;

    @Mock
    ClassA mockA;

    @Before
    public void setup(){


        classB=new ClassB(mockA);

        Mockito.when(classB.getClassA()).thenReturn(null);

    }

    @Test
    public void testA(){

        ClassA obj=classB.getClassA();

        assert(obj==null);

    }
}
15
apil.tamang

Сторонние плагины могут регистрировать пользовательские реализации MockMaker, которые создают классы не так, как поведение по умолчанию через SPI Mockito. Как часть указанного поведения, начиная с Mockito 2.0, MockMaker может решить, является ли класс mockable, например, классы final в случае PowerMock. Чтобы интегрировать такое пользовательское поведение, PowerMock регистрирует пользовательскую переменную MockMaker, которая затем используется Mockito.

В Mockito 2.0 API для пользовательской MockMaker пришлось расширять, но PowerMock еще не адаптирует расширения API. Таким образом, этот новый метод еще не реализован MockMaker PowerMock, что приводит к AbstractMethodError.

8
Rafael Winterhalter

Я столкнулся с той же ошибкой. Для меня это помогло включить 

import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.spy;

вместо методов mock() и spy() Mockitos. @Mock остался прежним.

4
Dornathal

Не уверен, что это то, что вы пытаетесь сделать. Но если вы пытаетесь вернуть null всякий раз, когда вызывается getClassA, вам следует смоделировать объект типа ClassB! (поскольку getClassA является методом этого класса).

1
armen

Правильный ответ дал Рафаэль Винтерхальтер. Но в настоящее время команда PowerMockito работает над обеспечением поддержки Mockito2 + Последней стабильной версией на данный момент является RC4.

testCompile 'org.powermock:powermock-api-mockito2:1.7.0RC4'

Он компилируется, но есть еще много проблем

Вот вики-страница о поддержке Mockito 2 https://github.com/powermock/powermock/wiki/Mockito-2-(Maven)

1
Lemberg

У меня была такая же проблема при работе с mockito-core: jar: 2.18.3 и powermock-api-mockito: 1.6.3 . Это сработало для меня, когда я перешел на mockito-core: jar: 2.0.5-beta ,.

0
Kaushik