Mockito 无法模拟 RestTemplate 交换

问题描述 投票:0回答:1

我在测试用例中使用restTemplate模拟,无法在代码中进行模拟。尝试拨打电话但没有成功

请找到如下测试用例:

when(restTemplate.exchange(any(),eq(HttpMethod.POST),any(HttpEntity.class),eq(MemberDataValidationResponse.class))) .thenReturn(ResponseEntity.ok(mockResponse));

@Test
public void testValidateMemberData_Success() throws Exception {
    MemberValidationRequest memberRequest = new MemberValidationRequest();
    memberRequest.setCorelationIdentifier("123");

    MemberDataValidationResponse mockResponse = new MemberDataValidationResponse();
    mockResponse.setStatus("200");

    HttpHeaders headers = SelfServiceValidation.populateTokenHeaders();
    HttpEntity<String> httpEntity = new HttpEntity<>(new JSONObject(memberRequest).toString(), headers);
    
    when(restTemplate.exchange(any(), eq(HttpMethod.POST), any(HttpEntity.class), eq(MemberDataValidationResponse.class)))
            .thenReturn(ResponseEntity.ok(mockResponse));
    MemberDataValidationResponse response = new MemberDataValidationResponse();
    
    
     try (MockedStatic<SelfServiceDaoHelper> mockStatic = mockStatic(SelfServiceDaoHelper.class)) {
         
         mockStatic.when(() ->SelfServiceDaoHelper.auditApiRequestData(any(MapSqlParameterSource.class))).thenReturn(1);
                 
     assertEquals(1, SelfServiceDaoHelper.auditApiRequestData(new MapSqlParameterSource()));
     MemberDataValidationResponse result = SelfServiceValidation.validateMemberData(memberRequest);
     response = result;
     
     };
    
    assertNotNull(response);
    assertEquals("200", response.getStatus());
}

这是下面的实际方法:

public static MemberDataValidationResponse validateMemberData(MemberValidationRequest memberValidationRequest)
        throws Exception {
    MemberDataValidationResponse memberValidateResponse = new MemberDataValidationResponse();
    try {
        if (isSelfServicePortalServerAvailable(selfServicePortalURL)) {
            String corelationId = UUID.randomUUID().toString();
            InetAddress ipAddress = InetAddress.getLocalHost();
            String spanId = corelationId + SelfServicePortalConstants.MEMBER_VALIDATION_CODE;
            HttpHeaders headers = populateTokenHeaders();
            RestTemplate restTemplate = new RestTemplate();
            String validateMemberAPI = selfServicePortalURL + Endpoints.MEMBER_VALIDATION;
            log.info("Self Service Portal API URL :{}", validateMemberAPI);
            JSONObject jsonObj = new JSONObject(memberValidationRequest);
            String requestBody = jsonObj.toString();
            HttpEntity<String> request = new HttpEntity<>(requestBody, headers);
            processRequestAudit(memberValidationRequest, corelationId, spanId, ipAddress.toString(),
                    "Member Validation", "Claim Submission");
            UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(validateMemberAPI);
            ResponseEntity<MemberDataValidationResponse> response = restTemplate.exchange(
                    builder.buildAndExpand().toUri(), HttpMethod.POST, request, MemberDataValidationResponse.class);
            memberValidateResponse = (MemberDataValidationResponse) response.getBody();
            processResponseAudit(memberValidateResponse, "", spanId, corelationId);
        } else {
            log.info(SELF_SERVICE_PORTAL_UNAVAILABLE_MESSAGE);
        }
    } catch (Exception cause) {
        throw new RuntimeException(cause);
    }
    return memberValidateResponse;
}
java spring-boot unit-testing junit mockito
1个回答
0
投票

如果您可以依赖 spring-boot 测试功能(例如

@RestClientTest
),我真的会尝试努力重构此代码,传递客户端以及可能的基本 URL。

但是,如果您必须坚持当前的实现,也许您可以使用 Mockito MockedConstruction 功能来解决,请参阅:https://www.baeldung.com/java-mockito-mockedconstruction

例如

try (MockedConstruction mocked = mockConstruction(RestTemplate.class)) {
    RestTemplate restTamplate = new RestTemplate();
    when(restTamplate.exchange(...)).thenReturn(...);
}
© www.soinside.com 2019 - 2024. All rights reserved.