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