模拟 RestTemplate.exchange() 方法给出空值
Mocking RestTemplate.exchange() method gives null value
模拟 RestTemplate.exchange() 无效。 restTemplate.exchange() 模拟的响应在 BDS 适配器 class 处给出空值。我的测试用例因 BDSAdapter class 中的空指针异常而失败。 (response.getStatusCodeValue() 给出空指针异常..Mockito 提示
未使用...-> 在 com..policydetails_adapters.BDSAdapterTest.getInsuranceHoldings(BDSAdapterTest.java:56)
[MockitoHint] ...args 好吗? -> 在 com.policydetails_adapters.BDSAdapter.fetchInsuranceDetails(BDSAdapter.java:77)
Below are my classes.
测试Class:
@RunWith(MockitoJUnitRunner.class)
public class BDSAdapterTest {
@InjectMocks
private BDSAdapter bdsAdapter;
@Mock
private BDSFetchInsuranceDetailsRequest bdsFetchInsuranceDetailsRequest;
@Mock
private RestTemplate restTemplate;
@Mock
Environment env;
@Test
public void getInsuranceHoldings() throws InsuranceHoldingsException {
Mockito.when(restTemplate.exchange(
ArgumentMatchers.anyString(),
ArgumentMatchers.any(HttpMethod.class),
ArgumentMatchers.any(),
ArgumentMatchers.<Class<BDSFetchInsuranceDetailsResponse>>any()))
.thenReturn(sampleBDSCustomerInsuranceHoldings());
BDSFetchInsuranceDetailsResponse bdsFetchInsuranceDetailsResponse = bdsAdapter.fetchInsuranceDetails("MBSG", "S6564318I", "1234", "007");
assertNotNull("response is not null", bdsFetchInsuranceDetailsResponse);
}
public static ResponseEntity<BDSFetchInsuranceDetailsResponse> sampleBDSCustomerInsuranceHoldings() {
BDSFetchInsuranceDetailsResponse bdsResponse = new BDSFetchInsuranceDetailsResponse();
Header header = new Header();
header.setChannelId("MBSG");
header.setMsgId("4aBE50ZrQtjVuXfTyALJ");
bdsResponse.setHeader(header);
ResponseEntity<BDSFetchInsuranceDetailsResponse> response = new ResponseEntity<BDSFetchInsuranceDetailsResponse>(bdsResponse, HttpStatus.ACCEPTED);
return response;
}
}
我的实际class
@组件
public class BDSAdapter {
@Autowired
RestTemplate restTemplate;
@Autowired
BDSFetchInsuranceDetailsRequest bdsFetchInsuranceDetailsRequest;
@Autowired
Environment env;
public BDSFetchInsuranceDetailsResponse fetchInsuranceDetails(String channelId, String customerId,
String insurerCode, String policyNumber) throws InsuranceHoldingsException {
BDSFetchInsuranceDetailsResponse bdsFetchInsuranceDetailsResponse = null;
try {
logger.info("Inside BDSAdapter::fetchInsuranceDetails");
Header header = new Header();
header.setMsgId(RandomStringUtils.randomAlphanumeric(20));
header.setChannelId(channelId);
bdsFetchInsuranceDetailsRequest.setHeader(header);
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Accept", MediaType.APPLICATION_JSON_VALUE);
HttpEntity<BDSFetchInsuranceDetailsRequest> requestEntity = new HttpEntity<>(bdsFetchInsuranceDetailsRequest, requestHeaders);
ResponseEntity<BDSFetchInsuranceDetailsResponse> response = restTemplate.exchange(env.getProperty("bds_fetch_insurance_details_url"),HttpMethod.POST, requestEntity, BDSFetchInsuranceDetailsResponse.class);
if(response.getStatusCodeValue() == 204) {
throw new InsuranceHoldingsException(response.getStatusCode().toString(), "No Content");
}
bdsFetchInsuranceDetailsResponse = response.getBody();
} catch (Exception e) {
e.printStackTrace();
}
}
return bdsFetchInsuranceDetailsResponse;
}
}
也许,因为 BDSFetchInsuranceDetailsResponse
的模拟将 return 不是 BDSFetchInsuranceDetailsResponse
的 class,而是一些模拟 class
restTemplate.exchange() 方法中的参数应该匹配。在此代码中 env.getProperty("bds_fetch_insurance_details_url") returns null 与 String 不匹配。所以它给出了空响应。
在 When(restTemplate.exchange(-,-,-,-).thenReturn(myResponse) 之前添加以下语句。它正在工作
`Mockito.when(env.getProperty("bds_fetch_insurance_details_url")).thenReturn("anyString")`;
模拟 RestTemplate.exchange() 无效。 restTemplate.exchange() 模拟的响应在 BDS 适配器 class 处给出空值。我的测试用例因 BDSAdapter class 中的空指针异常而失败。 (response.getStatusCodeValue() 给出空指针异常..Mockito 提示
未使用...-> 在 com..policydetails_adapters.BDSAdapterTest.getInsuranceHoldings(BDSAdapterTest.java:56) [MockitoHint] ...args 好吗? -> 在 com.policydetails_adapters.BDSAdapter.fetchInsuranceDetails(BDSAdapter.java:77)
Below are my classes.
测试Class:
@RunWith(MockitoJUnitRunner.class)
public class BDSAdapterTest {
@InjectMocks
private BDSAdapter bdsAdapter;
@Mock
private BDSFetchInsuranceDetailsRequest bdsFetchInsuranceDetailsRequest;
@Mock
private RestTemplate restTemplate;
@Mock
Environment env;
@Test
public void getInsuranceHoldings() throws InsuranceHoldingsException {
Mockito.when(restTemplate.exchange(
ArgumentMatchers.anyString(),
ArgumentMatchers.any(HttpMethod.class),
ArgumentMatchers.any(),
ArgumentMatchers.<Class<BDSFetchInsuranceDetailsResponse>>any()))
.thenReturn(sampleBDSCustomerInsuranceHoldings());
BDSFetchInsuranceDetailsResponse bdsFetchInsuranceDetailsResponse = bdsAdapter.fetchInsuranceDetails("MBSG", "S6564318I", "1234", "007");
assertNotNull("response is not null", bdsFetchInsuranceDetailsResponse);
}
public static ResponseEntity<BDSFetchInsuranceDetailsResponse> sampleBDSCustomerInsuranceHoldings() {
BDSFetchInsuranceDetailsResponse bdsResponse = new BDSFetchInsuranceDetailsResponse();
Header header = new Header();
header.setChannelId("MBSG");
header.setMsgId("4aBE50ZrQtjVuXfTyALJ");
bdsResponse.setHeader(header);
ResponseEntity<BDSFetchInsuranceDetailsResponse> response = new ResponseEntity<BDSFetchInsuranceDetailsResponse>(bdsResponse, HttpStatus.ACCEPTED);
return response;
}
}
我的实际class
@组件 public class BDSAdapter {
@Autowired
RestTemplate restTemplate;
@Autowired
BDSFetchInsuranceDetailsRequest bdsFetchInsuranceDetailsRequest;
@Autowired
Environment env;
public BDSFetchInsuranceDetailsResponse fetchInsuranceDetails(String channelId, String customerId,
String insurerCode, String policyNumber) throws InsuranceHoldingsException {
BDSFetchInsuranceDetailsResponse bdsFetchInsuranceDetailsResponse = null;
try {
logger.info("Inside BDSAdapter::fetchInsuranceDetails");
Header header = new Header();
header.setMsgId(RandomStringUtils.randomAlphanumeric(20));
header.setChannelId(channelId);
bdsFetchInsuranceDetailsRequest.setHeader(header);
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Accept", MediaType.APPLICATION_JSON_VALUE);
HttpEntity<BDSFetchInsuranceDetailsRequest> requestEntity = new HttpEntity<>(bdsFetchInsuranceDetailsRequest, requestHeaders);
ResponseEntity<BDSFetchInsuranceDetailsResponse> response = restTemplate.exchange(env.getProperty("bds_fetch_insurance_details_url"),HttpMethod.POST, requestEntity, BDSFetchInsuranceDetailsResponse.class);
if(response.getStatusCodeValue() == 204) {
throw new InsuranceHoldingsException(response.getStatusCode().toString(), "No Content");
}
bdsFetchInsuranceDetailsResponse = response.getBody();
} catch (Exception e) {
e.printStackTrace();
}
}
return bdsFetchInsuranceDetailsResponse;
}
}
也许,因为 BDSFetchInsuranceDetailsResponse
的模拟将 return 不是 BDSFetchInsuranceDetailsResponse
的 class,而是一些模拟 class
restTemplate.exchange() 方法中的参数应该匹配。在此代码中 env.getProperty("bds_fetch_insurance_details_url") returns null 与 String 不匹配。所以它给出了空响应。 在 When(restTemplate.exchange(-,-,-,-).thenReturn(myResponse) 之前添加以下语句。它正在工作
`Mockito.when(env.getProperty("bds_fetch_insurance_details_url")).thenReturn("anyString")`;