web-dev-qa-db-fra.com

erreur lors de l'initialisation de mockito, à chaque fois et pour tous les cas de test

Assez longtemps passé toute la journée à lutter contre cela. Peu importe le type de tests/classe/interface que j'utilise, je reçois à peu près la même exception. Voici le stackerror:

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)

Enfait, je ne comprends même pas pourquoi la bibliothèque de powermock est impliquée. Il a été compilé pendant que j'essayais de me moquer de certains cours finaux, mais c'était il y a des heures!

Voici un ensemble de fichiers que j'essaie d'utiliser:

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;
    }
}

et la classe de test:

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

Il est possible que des plugins tiers enregistrent des implémentations personnalisées MockMaker qui créent des classes différemment du comportement par défaut via le SPI de Mockito. En tant que partie du comportement spécifié, depuis Mockito 2.0, un MockMaker peut décider si une classe est mocassable, telle que final classes dans le cas de PowerMock. Pour intégrer un tel comportement personnalisé, PowerMock enregistre une MockMaker personnalisée qui est ensuite utilisée par Mockito.

Dans Mockito 2.0, l’API d’une MockMaker personnalisée devait être étendue, mais PowerMock n’adapte pas encore les extensions de l’API. Par conséquent, cette nouvelle méthode n'est pas encore implémentée par PowerMock MockMaker, ce qui entraîne AbstractMethodError.

8
Rafael Winterhalter

J'ai rencontré la même erreur. Pour moi, cela a aidé à inclure 

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

au lieu des méthodes Mockitos mock() et spy(). @Mock est resté le même.

4
Dornathal

Vous ne savez pas si c'est ce que vous essayez de faire. Mais si vous essayez de renvoyer null à chaque appel de getClassA, vous devriez alors simuler un objet de type ClassB! (puisque getClassA est une méthode de cette classe).

1
armen

La réponse correcte a été donnée par Raphael Winterhalter. Mais actuellement PowerMockito team travaille à apporter le support de Mockito2 + La dernière version stable pour l’instant est RC4

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

Il compile mais il reste encore beaucoup de problèmes

Voici la page Wiki sur le support Mockito 2 https://github.com/powermock/powermock/wiki/Mockito-2-(Maven)

1
Lemberg

Le même problème se posait lorsque je travaillais avec mockito-core: jar: 2.18.3 et powermock-api-mockito: 1.6.3. -bêta.

0
Kaushik