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
相关产品推荐
相关产品推荐

