2015-07-28 5 views
11

Praticamente ho trascorso l'intera giornata a combattere questo. Non importa che tipo di test/classe/interfaccia io uso, ottengo praticamente la stessa eccezione. Ecco lo stackerror:errore durante l'inizializzazione di mockito, sempre e per qualsiasi caso di test

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) 

Infatti, io non capisco nemmeno il motivo per cui la libreria powermock è coinvolto. Viene compilato mentre cercavo di prendere in giro alcune classi finali, ma erano passate ore fa!

Ecco un insieme reale dei file che sto cercando di utilizzare:

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

e la classe di 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); 

    } 
} 
+1

Hai ricostruito il progetto? Come in, ha completamente distrutto i file di classe e ha tentato di ricostruirlo? – Makoto

+0

Ho fatto un paio di volte. Ad ogni modo, questa volta subito dopo aver postato questo problema, ho rimosso il testCompile per la libreria powermockito, ho ricostruito le configurazioni, poi la build, e ha funzionato ... ad eccezione del fatto che sto ottenendo un altro errore criptico .. Mockito si lamenta di MissingMethoException per 'getClassA()' sebbene sia realmente definito per ClassB. qualche idea? –

+0

Non penso che ci siano abbastanza informazioni nel tuo commento di follow-up per andare avanti. Vorrei pubblicare una domanda a parte con la traccia completa e collegarmi a questa. –

risposta

1

Non sono sicuro se questo è ciò che si sta cercando di fare. Ma se stai cercando di restituire null ogni volta che viene chiamato getClassA, allora dovresti prendere in giro l'oggetto di tipo ClassB! (dal momento che getClassA è un metodo di quella classe).

+1

Yapp l'ha capito nel giro di poco tempo. Ma il problema originale rimane ancora: perché il conflitto tra i podisti mockito e powermock?Ciò significa che non potrei mai caricare contemporaneamente le librerie powermock e mockito? –

7

È possibile che plug-in di terze parti registrino implementazioni personalizzate di MockMaker che creano classi in modo diverso rispetto al comportamento predefinito tramite SPI di Mockito. Come parte del comportamento specificato, dal momento che Mockito 2.0, un MockMaker può decidere se una classe è sopportabile, come le classi final nel caso di PowerMock. Per integrare un comportamento personalizzato, PowerMock registra un numero personalizzato MockMaker che viene poi utilizzato da Mockito.

In Mockito 2.0, l'API per una consuetudine MockMaker doveva essere esteso, ma PowerMock non ha ancora adattare le estensioni API. Pertanto, questo nuovo metodo non è ancora stato implementato da PowerMock MockMaker ciò che risulta in un AbstractMethodError.

3

Mi sono imbattuto nello stesso errore. Per me ha aiutato a comprendere

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

invece di Mockitos mock() e spy() metodi. @Mock è rimasto lo stesso.

0

La risposta corretta è stata data da Raphael Winterhalter. Ma attualmente PowerMockito team sta lavorando per portare il supporto di Mockito2 + Ultima versione stabile per ora è RC4

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

Compila ma ci sono ancora un sacco di problemi

Qui la pagina Wiki su Mockito 2 supporto https://github.com/powermock/powermock/wiki/Mockito-2-(Maven)

Problemi correlati