2016-05-12 5 views
0

Ich habe eine Service/Dao-Schicht. Die Service-Layer-Methode ruft die erste Methode von dao auf, von der ich eine Antwort erhalte, und rufe die zweite Methode in dao auf, um einige Argumente einschließlich des Wertes aus der Antwort der 1. dao-Methode zu übergeben. Ich habe versucht mit Mock, aber es ist mit Null Zeiger fehlgeschlagen. Pseudo-Code ist so etwas wie unten:Mocking konsekutiven REST-Aufruf

Service{ 
serviceMethod(some_args){ 
response1 = dao.method1(some_args); 
someItem = response1.get("someItem"); 

/* do some logic on someitem to create otherItem*/ 
request2.setArgs(someItem); 
response2 = dao.method2(request2); 
} 
} 

ich versucht habe, wie unten zu verspotten, aber es funktioniert nicht.

@Test 
     public void testPass(){ 
     mockResponse1 = new Response1(); 
     mockRequest2 = new MockRequest2(); 
     when(dao.method1(some_args)).thenReturn(mockResponse1) 
     mockResponse1.setArgs(some_args); 
     mockRequest2.setArgs(mockResponse1.getargs()); 
     mockResponse2 = new Response2(); 
     when(dao.method2(mockRequest2)).thenReturn(mockResponse2) 
     service.serviceMethod(some_args) 
     } 
+1

Ist das ein echter Java-Code oder nur ein Pseudo-Code? Ich sehe, dass mockResponse1 eine tatsächliche Instanz und mockResponse2 auch eine tatsächliche Instanz ist. Wenn Sie diese Mocks aufrufen, erwartete ich etwas wie Mock (Response1.class) und Mock (Response2.class). Wenn Sie das nicht bemerkt haben, dann gibt es Ihr Problem. –

+0

'Code ist etwas wie 'kann es schwierig machen, das Problem zu erkennen, wenn Sie nicht den Code für die eigentliche Schein-Erstellung (=' dao') enthalten und auch den Code enthalten, wo Sie den Mock in die Serviceklasse injizieren. Außerdem ist 'mockRequest2' nicht irgendwo in Ihrem Testcode definiert. –

+0

Dies ist Pseudocode –

Antwort

0

könnten Sie ein ArgumentCaptor, um den Wert zu erhalten, die in dao.method2(...) und dann Behauptungen auf, dass übergeben wurde machen.

Zum Beispiel sagen, dass ich dieses DAO hatte ...

public interface DAO { 
    Response method1(Request request);  
    Response method2(Request request); 
} 

Und dieser Service ...

public class Service { 

    private DAO dao; 

    public void setDao(DAO dao) { 
     this.dao = dao; 
    } 

    public Response serviceMethod(Request someArgs) { 
     Response response1 = dao.method1(someArgs); 
     String someItem = response1.getTheResponse(); 
     Request request2 = new Request(someItem); 
     return dao.method2(request2); 
    } 
} 

Ein Test für diesen Dienst könnte ...

import static org.fest.assertions.Assertions.assertThat; 
import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.verify; 
import static org.mockito.Mockito.when; 

import org.junit.Before; 
import org.junit.Test; 
import org.mockito.ArgumentCaptor; 
import org.mockito.Captor; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 

public class ServiceTest { 

    @Mock 
    private Request request; 

    @Mock 
    private Response response; 

    @Mock 
    private Response serviceResponse; 

    @Mock 
    private DAO dao; 

    @InjectMocks 
    private Service service; 

    @Captor 
    private ArgumentCaptor<Request> requestCaptor; 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void shouldDoServiceMethod() { 
     // Set up 
     when(dao.method1(request)).thenReturn(response); 
     when(response.getTheResponse()).thenReturn("[ARGUMENT]"); 
     when(dao.method2(any(Request.class))).thenReturn(serviceResponse); 

     // Code under test 
     Response actualResponse = service.serviceMethod(request); 

     // Verification 
     assertThat(actualResponse).isSameAs(serviceResponse); 

     verify(dao).method2(requestCaptor.capture()); 

     Request actualSecondRequest = requestCaptor.getValue(); 

     assertThat(actualSecondRequest.getArgs()).isEqualTo("[ARGUMENT]"); 
    } 
} 

Die Schlüsselzeile ist ...

verify(dao).method2(requestCaptor.capture()); 

Dies überprüft, dass method2 aufgerufen wurde und erfasst den Wert, mit dem es aufgerufen wurde.

Sie dann den Wert bekommen ...

Request actualSecondRequest = requestCaptor.getValue(); 

... und Sie können dann überprüfen, ob die relevanten Informationen festgelegt wurde ...

assertThat(actualSecondRequest.getArgs()).isEqualTo("[ARGUMENT]"); 

Hoffnung, das hilft.


Für Vollständigkeit, hier ist Request und Response ...

public class Request { 

    private String args; 

    public Request(String args) { 
     this.args = args; 
    } 

    public String getArgs() { 
     return args; 
    } 
} 

public class Response { 

    private String theResponse; 

    public Response(String theResponse) { 
     this.theResponse = theResponse; 
    } 

    public String getTheResponse() { 
     return theResponse; 
    } 
}