2016-07-29 22 views
1

Ich habe Probleme, während die private Methode mit powermockito verspotten. Echte Methode wird aufgerufen. Ich versuche, eine öffentliche Methode zu testen, die private Methode mit URI-Typ-Parameter aufruft und String zurückgibt. Ich habe alle Optionen ausprobiert, aber es ruft immer die richtige Methode auf, weil ich einen Zahlenformatfehler bekomme.Powermock Aufruf der realen Methode anstelle von Spion eins

package p; 
import static org.junit.Assert.*; 
import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.io.Reader; 
import java.io.StringReader; 
import java.lang.reflect.Method; 
import java.net.URI; 
import java.util.ArrayList; 
import java.util.List; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.utils.URIBuilder; 
import org.junit.Before; 
import org.junit.Test; 
import org.mockito.MockitoAnnotations; 
import org.powermock.api.mockito.PowerMockito; 
import com.wb.classics.handler.SearchInputInfo; 
import org.powermock.api.support.membermodification.MemberMatcher.method; 
import org.mockito.Matchers.anyString; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Test.class) 
public class Test { 


@Before 
public void setUp() throws Exception { 

    MockitoAnnotations.initMocks(this); 
    // Create an object of a class under test. 
    privateMethodClass = new PrivateMethodClass(); 

} 
@Test 
public void Test() throws Exception { 

    URI uri = null; 
    URIBuilder builder = new URIBuilder(); 
    String MPM = "2000081"; 
    builder.setScheme("http").setHost("localhost").setPort(Integer.valueOf("8000")).setPath("/classic").setParameter("MPM", MPM); 
    uri = builder.build(); 
    System.out.println("uri*********"+uri); 
    String jsonstring ="jsonstring"; 

    PrivateMethodClass msspy = PowerMockito.spy(new PrivateMethodClass()); 
    System.out.println("msspy***"+msspy); 

    /*when(msspy, method(PrivateMethodClass .class,"privatemethod", URI.class)) 
    .withArguments(uri) 
    .thenReturn(jsonstring);*/ 

    PowerMockito.doReturn(jsonstring).when(msspy,"privatemethod", uri); 

    /*PowerMockito.doReturn(true).when(msspy, 
       method(MarkLogicServices.class, "privatemethod", URI.class)) 
       .withArguments(uri);*/ 

    String result= msspy.methodToTest(MPM); 

    System.out.println("service****"+result); 


} 
} 

und die Klasse ist

public PrivateMethodClass{ 

public String methodPublic() 
{ 
URI uri=""; 
return methodprivate(uri); 
} 


private String methodprivate(URI uri) 
{ 
return str; 
} 
} 

pom.xml

<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
    </dependency> 

    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-api-mockito</artifactId> 
     <version>1.6.1</version> 
     <scope>test</scope> 
    </dependency> 


    <dependency> 
     <groupId>org.powermock</groupId> 
     <artifactId>powermock-module-junit4</artifactId> 
     <version>1.6.1</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.mockito</groupId> 
     <artifactId>mockito-all</artifactId> 
     <version>1.9.5</version> 
     <scope>test</scope> 
    </dependency> 

Unten ist die Fehlermeldung ..

java.lang.NumberFormatException: null 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.valueOf(Unknown Source) 
    at com.wb.classics.handler.services.MarkLogicServices.fetchClassicByMPM(MarkLogicServices.java:132) 
at com.wb.classics.handler.services.MarkLogicServicesTest.fetchClassicByMPMTest(MarkLogicServicesTest.java:159) 
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.internal.runners.TestMethod.invoke(TestMethod.java:68) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310) 
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:294) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 
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:282) 
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:207) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) 
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
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:122) 
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106) 
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) 
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) 
+0

Wenn Sie eine private Methode verspotten, vielleicht sollte das Verfahren auf eine separate Schnittstelle zugeordnet werden? Wenn Sie Teile einer Klasse verspotten müssen, könnte dies ein Designproblem darstellen. –

+0

Nein, es ist nicht Interface zugewiesen, aber ich kann es immer noch nicht mcok. – user3541321

+0

Können Sie bitte die Deklaration der relevanten Klasse/Methode sowie die Deklaration (insbesondere die Annotationen!) Der Testklasse teilen? – Mureinik

Antwort

2

Sie müssen Ihren Test mit Anmerkungen versehen zu ermöglichen PowerMockito, um deine Klasse zu verspotten:

+0

Klasse kann nicht in einen Typ aufgelöst werden. Dieser Fehler wird angezeigt. – user3541321

+0

@ user3541321 Sie müssen importieren - 'import org.powermock.modules.junit4.PowerMockRunner;' – Mureinik

+0

Aber um dies zu importieren, muss ich unten Abhängigkeit in meinem Pom hinzufügen. org.powermock PowerMock-Modul-junit4 1.5.1 user3541321

0

Problem scheint hier zu sein, dass Sie die Methode auf Spion-Instanz aufrufen, statt zu spotten.

Wie @Mureinik sagte

@RunWith(PowerMockRunner.class) 
@PrepareForTest(PrivateMethodClass.class) 
public class Test{..... 

Ihre Testmethode

@Test 
public void Test() throws Exception { 

    URI uri = null; 
    URIBuilder builder = new URIBuilder(); 
    String MPM = "2000081"; 
    builder.setScheme("http").setHost("localhost").setPort(Integer.valueOf("8000")).setPath("/classic").setParameter("MPM", MPM); 
    uri = builder.build(); 
    System.out.println("uri*********"+uri); 
    String jsonstring ="jsonstring"; 

    PrivateMethodClass ms = Mockito.mock(PrivateMethodClass.class); 
    System.out.println("msspy***"+ms); 


    PowerMockito.doReturn(jsonstring).when(msspy,"privatemethod", uri);  

    String result= ms.methodToTest(MPM); 

    System.out.println("service****"+result); 



}