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;
}
}
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. –
'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. –
Dies ist Pseudocode –