2013-04-18 5 views
7

Meine Klasse im Test haben diese MethodeMockito Muster für einen Frühling Web-Service-Aufruf

public SomeWebServiceResponse callDownstream(SomeWebServiceRequest request) { 
    return (SomeWebServiceResponse) super.callService(request); 
} 

die Super-Methode ist nur ein Aufruf zum Frühling WS, um den Anruf zu machen - in vereinfachter Form

response = getWebServiceTemplate().marshalSendAndReceive(this.getBaseURL(), 
    request); 
return response; 

Wenn ich einen Komponententest schrieb, versuchte es einen tatsächlichen Webservice-Anruf. Mir ist nicht klar, wie ich das verspotten soll oder was wir eigentlich verspotten sollten.

Sollte ich eine Beispielantwort vom Dateisystem laden und nach einer Zeichenkette darin suchen - in diesem Fall teste ich nur Dateiladen.

Der eigentliche Anruf ist in der Basisklasse und ich weiß, dass wir nur diese Methode nicht vortäuschen können. Irgendwelche Zeiger?

Antwort

8

Spring bietet auch Möglichkeiten zum Mocking von Web-Service-Servern sowie Anfragen von Kunden. Das Kapitel 6.3 in der Spring WS manual zeigt, wie man Spott macht.

Die Spring WS Mocking-Funktion ändert das Verhalten der Web-Service-Vorlage, sodass Sie diese Methode in der Super-Klasse aufrufen können - diese Methode würde dann den Spring Mock Service Server aufrufen.

Hier ist ein Beispiel Unit-Test mit dem Spring Mock-Service-Server ist:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:spring-ws.xml"}) 
public class SetStatusFromSrsTemplateTest { 
    @Autowired 
    private WebServiceTemplate wsTemplate; 

    @Before 
    public void setUp() throws Exception { 
     mockServer = MockWebServiceServer.createServer(wsTemplate); 
    } 

    @Test 
    public void testCall() { 
     SomeWebServiceRequest sampleRequest = new SomeWebServiceRequest(); 
     // add properties to the sampleRequest... 
     Source expectedPayload = new ResourceSource(new ClassPathResource("exampleRequest.xml")); 
     Source expectedResponse = new ResourceSource(new ClassPathResource("exampleResponse.xml")); 
     mockServer.expect(payload(expectedPayload)).andRespond(withPayload(expectedResponse)); 
     instance.callDownStream(sampleRequest); 
     mockServer.verify(); 
    } 
} 

Das obige Beispiel wird der Schein-Service-Server mit dem angegebenen Nutzlast erwartet genau eine Anfrage machen und (wenn die Nutzlast des erwarteten empfangene Spiele Nutzlast) mit der gegebenen Antwortnutzlast antworten.

Wenn Sie jedoch nur überprüfen möchten, dass die Methode in der Superklasse tatsächlich während des Tests aufgerufen wird und wenn Sie nach dem Aufruf nicht an dem Nachrichtenaustausch interessiert sind, sollten Sie Mockito verwenden.

Wenn Sie Mockito verwenden möchten, würde ich den Spion vorschlagen (siehe auch Kamleshs Antwort). Z.B.

// Decorates this with the spy. 
MyClass mySpy = spy(this); 
// Change behaviour of callWebservice method to return specific response 
doReturn(mockResponse).when(mySpy).callWebservice(any(SomeWebServiceRequest.class)); 
// invoke the method to be tested. 
instance.callDownstream(request); 
// verify that callWebService has been called 
verify(mySpy, times(1)).callWebService(any(SomeWebServiceRequest.class)); 
+0

Entschuldigung für meinen vorherigen Kommentar. Ich glaube, ich habe das Problem nicht verstanden. Ich werde ein Beispiel für die Durchführung von Komponententests mit dem Spring-Mock-Service-Server bereitstellen. –

+0

Das Verspotten des gesamten Web-Service einschließlich des Sendens und Empfangens einer Nachricht (erstes Codebeispiel) ist eigentlich mehr als ein Komponententest - es ist ein Integrationstest, auf den auch im verwiesenen Spring-Handbuch hingewiesen wird. Wenn Sie nur einen Komponententest benötigen, sollten Sie bei Mockito bleiben (zweites Codebeispiel). – Justus

0

Als @Duncan sagte Zusammensetzung mit Abhängigkeits-Injektion wäre ein Weg zu gehen, wenn Sie können und dann diese Abhängigkeit verspotten.

Wenn Sie nicht können dann können Sie selektiv die Methoden Klasse unter Test mit Mockito spy Mock.