【发布时间】:2015-08-13 00:40:30
【问题描述】:
我正在尝试以下列方式使用 mockito。
这是主类IClient的一部分。
public LoginResponse doLogin() {
WebTarget target = buildTarget();
MultivaluedMap<String, Object> authHeaders = prepareHeaders();
Builder buildRequest = buildRequest(authHeaders,target);
Response loginRsp = buildRequest
.post(Entity.entity(" Valid JSON string",
MediaType.APPLICATION_JSON_TYPE));
if(loginRsp == null)
LOGGER.error("Response was null");// Response is always returned as null.
这是我的测试代码
@Test
public void testdoLoginPass(){
Response response = Response.ok().build();
WebTarget webTarget = inner.buildTarget();
Builder buildRequest = inner.buildRequest( getMockHeaders(),webTarget);
when(buildRequest.post(Entity.entity(anyString(),
MediaType.APPLICATION_JSON_TYPE))).thenReturn(response);
Assert.assertNotNull(inner.doLogin());
}
我似乎无法弄清楚为什么响应总是为空。任何想法将不胜感激。
inner 是匿名的内部类对象,为buildTarget() 和buildRequest() 提供相应的模拟值。我能够看到正确的模拟值是通过调试生成的。
这是匿名内部类
inner= new IClient(client, propConfig){
WebTarget buildTarget(){
WebTarget target= mock(WebTarget.class);
LOGGER.error("Returning mock");
return target;
}
Builder buildRequest(final MultivaluedMap<String, Object> Headers,WebTarget target){
Builder builder = mock(Builder.class);
LOGGER.error("Returning mock");
return builder;
}
};
编辑--基于使用相同实例的建议。
这是折射版。
@Test
public void testdoIusLoginPass(){
inner= new IClient(client, propConfig){
WebTarget buildIUSTarget(){
WebTarget target= mock(WebTarget.class);
LOGGER.error("Returning mock");
return target;
}
Builder buildRequest(final MultivaluedMap<String, Object> authHeaders,WebTarget target){
builder = mock(Builder.class);
LOGGER.error("HashCode for Builder from inner Relevant method "+ builder.hashCode());
LOGGER.error("Returning mock");
return builder;
}
};
Response response = Response.ok().build();
WebTarget target = innerIUS.buildIUSTarget();
builder = innerIUS.buildRequest( getMockHeaders(),target);
when(builder.post(Entity.entity(any(String.class),
MediaType.APPLICATION_JSON))).thenReturn(response)
Assert.assertNotNull(inner.doLogin());
}
实际方法内
public LoginResponse doIusLogin() {
WebTarget target = buildIUSTarget();
MultivaluedMap<String, Object> authHeaders = prepareIUSHeaders();
builder = buildRequest(authHeaders,target);
LOGGER.error("HashCode for Builder from doLogin "+ builder.hashCode());//identical hash codes
Response loginRsp = builder
.post(Entity.entity("Valid JSON String",
MediaType.APPLICATION_JSON_TYPE));
if(loginRsp == null)
LOGGER.error("Response was null");// Still null.
响应仍然为空。想法?
【问题讨论】:
-
感谢您的跟进。你能详细说明注射的意思吗?匿名内部类不是已经这样做了吗?
标签: java unit-testing mocking testng mockito