Java 为什么mockito注射的不是正确的反应?
我正试图以以下方式使用mockito 这里是主类Java 为什么mockito注射的不是正确的反应?,java,unit-testing,mocking,testng,mockito,Java,Unit Testing,Mocking,Testng,Mockito,我正试图以以下方式使用mockito 这里是主类IClient的一部分 public LoginResponse doLogin() { WebTarget target = buildTarget(); MultivaluedMap<String, Object> authHeaders = prepareHeaders(); Builder buildRequest = buildRequest(authHeaders,targ
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.
我似乎不明白为什么回复总是空的。任何想法都将不胜感激
internal
是一个新的内部类对象,它为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;
}
};
internal=新的IClient(客户端,propConfig){
WebTarget buildTarget(){
WebTarget=mock(WebTarget.class);
LOGGER.error(“返回模拟”);
回报目标;
}
Builder buildRequest(最终多值映射头,WebTarget目标){
Builder=mock(Builder.class);
LOGGER.error(“返回模拟”);
返回生成器;
}
};
编辑——基于使用同一实例的建议
这是折射的版本
@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 void testdoIusLoginPass(){
内部=新IClient(客户端,propConfig){
WebTarget buildIUSTarget(){
WebTarget=mock(WebTarget.class);
LOGGER.error(“返回模拟”);
回报目标;
}
生成器buildRequest(最终多值Map authHeaders,WebTarget目标){
builder=mock(builder.class);
LOGGER.error(“来自内部相关方法的生成器的HashCode”+Builder.HashCode());
LOGGER.error(“返回模拟”);
返回生成器;
}
};
Response=Response.ok().build();
WebTarget target=innerIUS.buildIUSTarget();
builder=innerIUS.buildRequest(getMockHeaders(),目标);
当(builder.post(Entity.Entity)(any(String.class)),
MediaType.APPLICATION_JSON))。然后返回(响应)
Assert.assertNotNull(内部.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.
public LoginResponse doIusLogin(){
WebTarget target=buildIUSTarget();
多值Map authHeaders=prepareIUSHeaders();
builder=buildRequest(authHeader,目标);
LOGGER.error(“来自doLogin的生成器的HashCode”+Builder.HashCode());//相同的哈希代码
响应loginRsp=builder
.post(Entity.Entity(“有效的JSON字符串”),
MediaType.APPLICATION_JSON_TYPE));
如果(loginRsp==null)
LOGGER.error(“响应为null”);//仍然为null。
响应仍然为空。想法?当从不使用匹配器时,您的
,这就是它为空的原因
Mockito不做深入的参数比较,所以它比较
Entity.entity(anyString(), MediaType.APPLICATION_JSON_TYPE)
与
使用Entity.equals
,它们不匹配。您应该编写一个自定义匹配器,或者用any(Entity.class)
替换前面的表达式
编辑:此外,您正在测试代码和测试类中使用不同的Builder
实例。您应该引用同一个实例。将其注入测试类
Edit#2:每次调用internal.buildRequest
。在测试代码和测试类代码中写入System.out.println(buildRequest.hashCode());
,您都会看到它们是两个不同的实例
很抱歉,但我无法提供修复问题所需的代码-至少我看不到有多少测试基础设施能够这样做
然而,我应该说,测试非常复杂,没有任何限制。我建议您集成一些框架(Guice或Spring)并开始使用它,否则您的测试过程可能很快就会变成一场噩梦。您应该定义moked对象的行为。
例如:
when(mockedList.get(anyInt())).thenReturn("element");
您必须将存根与模拟对象保持在一起
final Response response = Response.ok().build();
IClient inner = new IClient(client, propConfig){
Builder buildRequest(MultivaluedMap<String, Object> Headers, WebTarget target){
Builder builder = mock(Builder.class);
when(builder.post(any(Entity.class)).thenReturn(response)
return builder;
}
};
assertNotNull(inner.doLogin());
final Response=Response.ok().build();
IClient-internal=新的IClient(客户端,propConfig){
生成器buildRequest(多值映射头、WebTarget){
Builder=mock(Builder.class);
when(builder.post(any(Entity.class)).thenReturn(response)
返回生成器;
}
};
assertNotNull(inner.doLogin());
但是有一个小问题-这个测试几乎什么都不测试。那么本质上你是说这个对吗?当(buildRequest.post(Entity.Entity(any(Entity.class)、MediaType.APPLICATION(any)(any)(Entity.class)、MediaType.APPLICATION\u JSON\u TYPE))。然后返回(response);
。但是响应仍然是空的。我的意思是:当(buildRequest.post(any)(any)(Entity.class)))。然后返回(response);
我在(buildRequest.post(any(Entity.class)))时更正了您的建议(包括右括号)。然后返回(response)
。响应仍然为空:(Entity.Entity
方法是否返回Entity.class
的实例?我认为是字符串。下面是eclipse告诉我的Entity javax.ws.rs.client.Entity.Entity(String entity,String mediaType
这与问题无关。模拟行为在内部匿名类中定义。感谢您的跟进。您能详细说明注入的含义吗?匿名内部类不是已经在这样做了吗?另外,您是对的。测试在这一点上没有任何作用,我正在通过It注意到了这个奇怪的现象。没有修复就无法继续。
when(mockedList.get(anyInt())).thenReturn("element");
final Response response = Response.ok().build();
IClient inner = new IClient(client, propConfig){
Builder buildRequest(MultivaluedMap<String, Object> Headers, WebTarget target){
Builder builder = mock(Builder.class);
when(builder.post(any(Entity.class)).thenReturn(response)
return builder;
}
};
assertNotNull(inner.doLogin());