2013-04-18 21 views
7

moja klasa badanego posiada tę metodęMockito wzór do rozmowy Wiosna usług internetowych

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

super metoda jest po prostu wywołanie Spring WS, aby nawiązać połączenie - w uproszczonej formie

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

Kiedy piszę test jednostkowy, próbował wykonać rzeczywiste wywołanie usługi internetowej. Nie wiem, jak kpić z tego, a raczej z kpiny.

Powinieneś ładować przykładową odpowiedź z systemu plików i szukać w niej jakiegoś ciągu - w tym przypadku testuję tylko ładowanie pliku.

Rzeczywiste połączenie jest w klasie bazowej i wiem, że nie możemy kpić z tej metody. Jakieś wskazówki?

Odpowiedz

8

Wiosna zapewnia również udogodnienia do kpienia z serwerów usług internetowych, a także żądania od klientów. Rozdział 6.3 w Spring WS manual pokazuje, jak kpić.

Funkcja szydercza z wiosennego WS zmienia zachowanie szablonu usługi sieci Web, dzięki czemu można wywołać tę metodę w super-klasie - metoda ta wywołałaby wówczas usługę Spring Mock Service Server.

Oto test jednostka próbki z udawanym serwera usług Wiosna:

@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(); 
    } 
} 

Powyższy przykład spowoduje, że makiety serwer usługi oczekiwać dokładnie jeden wniosek z danym ładunkiem i (jeśli ładunek otrzymał pasuje oczekiwany ładunek danych) reaguje podanym obciążeniem odpowiedzi.

Jednakże, jeśli chcesz tylko sprawdzić, czy metoda w super-klasie jest rzeczywiście wywoływana podczas testu i jeśli nie interesuje Cię wymiana wiadomości po tym połączeniu, powinieneś użyć Mockito.

Jeśli chcesz używać Mockito, sugerowałbym szpiegowi (patrz także odpowiedź Kamlesha). Na przykład.

// 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

Przepraszamy za mój poprzedni komentarz. Myślę, że nie bardzo rozumiałem problem. Podam próbkę wykonania testów jednostkowych z serwerem usługi próbnej Spring. –

+0

Prześmiewanie całej usługi internetowej, w tym wysyłanie i odbieranie wiadomości (pierwszy przykład kodu), jest w rzeczywistości czymś więcej niż testem jednostkowym - jest to test integracyjny, jak również wskazany w wiosennym podręczniku. Jeśli potrzebujesz tylko testu jednostkowego, powinieneś trzymać się Mockito (drugi przykład kodu). – Justus

0

Jako że @Duncan powiedział, że kompozycja z zastrzykiem zależności będzie sposobem, aby przejść, jeśli możesz, a następnie kpić z tej zależności.

Jeśli nie możesz wtedy możesz selektywnie kpić z metod klasy w ramach testu przy użyciu mockito spy.