2017-10-21 108 views
1

Je veux tester une méthode qui utilise une méthode statique à l'intérieur, c'est pourquoi j'utilise PowerMockito. Je veux simuler un appel à Request.Get à partir de l'API Http Client Fluent. J'ai mis en place un test simple mais j'ai obtenu un UnfinishedStubbingException et je ne comprends pas pourquoi.UnfinishedStubbingException avec PowerMockito

Mockito 2.8.9 et Powermock 1.7.1

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Request.class) 
public class MyApiServiceTest { 

    @Test 
    public void callTest() throws IOException, JSONException, URISyntaxException { 
     PowerMockito.mockStatic(Request.class); 
     Path path = Paths.get(getClass().getClassLoader().getResource("data.json").toURI()); 
     byte[] fileBytes = Files.readAllBytes(path); 
     Content content = new Content(fileBytes, ContentType.APPLICATION_JSON); 
     PowerMockito.doReturn(content).when(Request.Get(anyString()).execute().returnContent()); 
    } 

} 

Stacktrace

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at com.example.service.MyApiServiceTest.callTest(MyApiServiceTest.java:42) 

E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, which is not supported 
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed 


    at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:182) 
    at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:164) 
    at org.powermock.core.MockGateway.methodCall(MockGateway.java:141) 
    at org.apache.http.client.fluent.Request.Get(Request.java) 
    at com.example.service.MyApiServiceTest.callTest(MyApiServiceTest.java:42) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:121) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 

Répondre

0

Il semble que vous essayez de se moquer trop de choses en même temps.

Essayez de stub les méthodes indépendamment execute() et returnContent():

@Test 
    public void callTest() throws IOException, JSONException, URISyntaxException { 
     // Arrange 
     PowerMockito.mockStatic(Request.class); 
     Request requestStub = Mockito.mock(Request.class); 
     Response responseStub = Mockito.mock(Response.class); 
     Path path = Paths.get(getClass().getClassLoader().getResource("data.json").toURI()); 
     byte[] fileBytes = Files.readAllBytes(path); 
     Content content = new Content(fileBytes, ContentType.APPLICATION_JSON); 

     Mockito.doReturn(responseStub).when(requestStub).execute(); 
     Mockito.doReturn(content).when(responseStub).returnContent(); 
     PowerMockito.doReturn(requestStub).when(Request.class, Mockito.anyString(), "Get"); 

     // Act and assert 
    } 

Alors powermockito est seulement utilisé pour retourner le requestStub tout le reste peut être fait avec Mockito plaine.

+0

Cela ne marche pas non plus. J'ai reçu la même exception dans l'appel 'PowerMockito.doReturn'. – Sydney

+1

pouvez-vous poster trace de la pile? –

+0

essayez d'utiliser une syntaxe un peu différente .. voir mise à jour –