Java 为什么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

我正试图以以下方式使用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.
我似乎不明白为什么回复总是空的。任何想法都将不胜感激

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());