You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit测试用例异常:调用方法返回结果始终为null求助

问题:调用validateMemberData方法的JUnit测试返回结果始终为null

尝试了各种方法,测试返回结果仍为null

测试用例代码

@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(SelfServiceValidation.getRestTemplate()).thenReturn(restTemplate);
    
    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 = getRestTemplate();
            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;
}


public static RestTemplate getRestTemplate (){
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate;
}

问题原因及修复方案

1. 未mock服务可用性检查方法

业务方法核心逻辑被isSelfServicePortalServerAvailable(selfServicePortalURL)的判断包裹,测试中未对这个静态方法做mock,实际执行时可能返回false,直接跳过核心逻辑,返回初始化的空对象。

修复:添加该方法的静态mock,使其返回true:

mockValidationStatic.when(() -> SelfServiceValidation.isSelfServicePortalServerAvailable(anyString()))
                   .thenReturn(true);

2. 静态方法mock作用域错误

原测试中getRestTemplate的mock写在MockedStatic块外,而该方法是静态方法,必须在静态mock作用域内定义才会生效。mock失效后,业务方法会创建新的RestTemplate实例,导致之前对restTemplate.exchange的mock无法触发。

修复:将getRestTemplate的mock移到静态mock块内:

mockValidationStatic.when(SelfServiceValidation::getRestTemplate)
                   .thenReturn(restTemplate);

3. 测试代码块作用域错误

原测试中assertEquals和validateMemberData调用的缩进错误,导致部分代码不在MockedStatic的作用域内,静态mock提前失效。需确保所有依赖静态方法的操作都在mock块内执行。

完整修复后的测试用例

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

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

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

    MemberDataValidationResponse response = new MemberDataValidationResponse();
    
    try (MockedStatic<SelfServiceValidation> mockValidationStatic = mockStatic(SelfServiceValidation.class);
         MockedStatic<SelfServiceDaoHelper> mockDaoStatic = mockStatic(SelfServiceDaoHelper.class)) {
        // mock服务可用性检查
        mockValidationStatic.when(() -> SelfServiceValidation.isSelfServicePortalServerAvailable(anyString()))
                           .thenReturn(true);
        // mock静态RestTemplate方法
        mockValidationStatic.when(SelfServiceValidation::getRestTemplate)
                           .thenReturn(restTemplate);
        // mock审计方法
        mockDaoStatic.when(() -> SelfServiceDaoHelper.auditApiRequestData(any(MapSqlParameterSource.class)))
                     .thenReturn(1);

        // 执行测试方法
        MemberDataValidationResponse result = SelfServiceValidation.validateMemberData(memberRequest);
        response = result;
    }
    
    assertNotNull(response);
    assertEquals("200", response.getStatus());
}

内容的提问来源于stack exchange,提问作者dhS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:22:07