2017-10-07 6 views
0

Je les bocaux suivants:PowerMockito ClassNotPreparedException

javax.servlet-api-3.1.9.jar 
junit-4.10.jar 
mockito-all-1.10.19.jar 
mockito-core-1.10.19.jar 
powermock-api-mockito-1.6.5.jar 
powermock-api-mockito-common-1.6.5.jar 
powermock-api-support-1.6.5.jar 
powermock-core-1.6.5.jar 
powermock-module-junit4-1.6.5.jar 
powermock-reflect-1.6.5.jar 

Je veux tester cette méthode appelée createPanel qui se trouve dans une classe appelée Controller:

public static void createPanel(HttpServletRequest req, HttpServletResponse res, HttpSession hs) throws IOException 
{ 
    PanelManager.createPanel(req, res, hs); 
} 

Dans la classe ControllerTest (testeur de JUnit), J'ai ceci:

import static org.mockito.Mockito.verify; 
import static org.mockito.Mockito.when; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mockito; 
import org.mockito.runners.MockitoJUnitRunner; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
import ApplicationLogic.Controller; 
import ApplicationLogic.PanelManager; 
import ApplicationLogic.RegistrationManager; 
import ApplicationLogic.SessionManager; 

@PrepareForTest(PanelManager.class) 
@RunWith(MockitoJUnitRunner.class) 

public class ControllerTest { 

    Controller controller = Mockito.mock(Controller.class); 

    SessionManager sessionManager = Mockito.mock(SessionManager.class); 

    RegistrationManager registrationManager = Mockito.mock(RegistrationManager.class); 
     . 
     . 
     . 
     . 

    @Test 

public void testcreatePanel() throws ServletException, IOException{ 

    HttpServletRequest req = Mockito.mock(HttpServletRequest.class); 
    HttpServletResponse res = Mockito.mock(HttpServletResponse.class); 
    HttpSession hs = Mockito.mock(HttpSession.class); 


    //PowerMockito.mock(SessionManager.class); 

    PrintWriter writer = new PrintWriter("somefile.txt"); 
    when(res.getWriter()).thenReturn(writer); 

    PowerMockito.mockStatic(Controller.class); 

    PowerMockito.doCallRealMethod().when(controller).createPanel(req, res, hs); 

Tous les tests s pour les autres méthodes de la classe contrôleur s'exécutent correctement. Pourquoi est-il la cause de cette erreur à PowerMockito.doCallRealMethod():

org.powermock.api.mockito.ClassNotPreparedException: 
The class ApplicationLogic.Controller not prepared for test. 
To prepare this class, add class to the '@PrepareForTest' annotation. 
In case if you don't use this annotation, add the annotation on class or method level. 

    at org.powermock.api.mockito.expectation.reporter.MockitoPowerMockReporter.classNotPrepared(MockitoPowerMockReporter.java:31) 
    at org.powermock.api.mockito.internal.mockcreation.MockTypeValidatorFactory$DefaultMockTypeValidator.validate(MockTypeValidatorFactory.java:38) 
    at org.powermock.api.mockito.internal.mockcreation.AbstractMockCreator.validateType(AbstractMockCreator.java:18) 
    at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMock(MockCreator.java:57) 
    at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:47) 
    at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:71) 
    at JUnitTest.ControllerTest.testcreatePanel(ControllerTest.java:253) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    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.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

Répondre

1

Vous devez utiliser le PowerMockRunner au lieu du MockitoJUnitRuner.

Cet exemple aborde la ClassNotPreparedException:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({PanelManager.class}) 
public class ControllerTest { 

    Controller controller = Mockito.mock(Controller.class); 

    @Test 
    public void testcreatePanel() throws Exception { 
     HttpServletRequest req = Mockito.mock(HttpServletRequest.class); 
     HttpServletResponse res = Mockito.mock(HttpServletResponse.class); 
     HttpSession hs = Mockito.mock(HttpSession.class); 

     PrintWriter writer = new PrintWriter("somefile.txt"); 
     Mockito.when(res.getWriter()).thenReturn(writer); 

     PowerMockito.mockStatic(PanelManager.class); 
     PowerMockito.doCallRealMethod().when(controller).createPanel(req, res, hs); 
    } 
} 

Cependant, il semble qu'il y ait peut-être encore quelques problèmes, même après que; vous vous moquez de Controller et le traitez comme un simulacre partiel en invoquant doCallRealMethod() dessus. Peut-être il y a une véritable raison (peut-être que la raison serait révélé en montrant plus de votre code) mais si vous ne disposez pas d'une véritable raison pour que vous pourrait alors supprimer cette ligne:

Controller controller = Mockito.mock(Controller.class); 

Et remplacer ligne ...

PowerMockito.doCallRealMethod().when(controller).createPanel(req, res, hs); 

avec ceci:

Controller.createPanel(req, res, hs); 

cela vous permettra de se moquer du comportement de PanelManager et de tester la réelle comportement de Controller en réponse au comportement simulé PanelManager.

+0

Merci Je viens de voir votre réponse en ce moment. Alors pourquoi cela fonctionnerait-il? Parce que je n'utilise pas 'doCallRealMethod()', cela n'a pas d'importance? – Lazaro

+0

@Lazaro vous avez demandé "pourquoi cela fonctionnerait-il?" Je ne suis pas sûr de savoir à quoi cela fait référence. Dans ma réponse, cette partie: "utiliser le PowerMockRunner au lieu du MockitoJUnitRuner" corrige l'exception ClassNotPreparedException. L'autre suggestion dans ma réponse évite d'utiliser "PowerMockito.doCallRealMethod()" du tout et à la place d'utiliser une véritable instance de contrôleur. – glytching