你可以使用一个ArgumentCaptor
来获取传递到dao.method2(...)
值,然后使上断言。
例如,说我有这个DAO ...
public interface DAO {
Response method1(Request request);
Response method2(Request request);
}
而这个服务...
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);
}
}
,此服务的测试可能是......
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]");
}
}
重点行...
verify(dao).method2(requestCaptor.capture());
这验证了method2
被调用并捕获了它被调用的值。
那么你得到的价值...
Request actualSecondRequest = requestCaptor.getValue();
...然后你可以验证相关的信息被设置...
assertThat(actualSecondRequest.getArgs()).isEqualTo("[ARGUMENT]");
希望这有助于。
为了完整起见,这里的Request
和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;
}
}
这是一个真正的Java代码,或只是一个伪代码?我看到mockResponse1是一个实际的实例,mockResponse2也是一个实际的实例。如果你打电话给这些嘲笑,我期待像模拟(Response1.class)和模拟(Response2.class)。如果你真的没有注意到这一点,那么你的问题。 –
''代码是''可能会让你难以发现问题,当你不包含实际的模拟创建代码(= dao'),并且还包括代码将模拟注入到服务类中的代码。此外'mockRequest2'没有在你的测试代码中的任何地方定义 –
这是伪代码 –