Java ResourceAccessException内部SocketTimeout异常的Junit代码覆盖率
我的目标是获得适配器类的代码覆盖率。我已经为read SocketTimeoutException(读取超时)编写了Junit测试用例,它没有调用getSampleStatus()方法。如何从我的测试类调用这个getSampleStatus()Java ResourceAccessException内部SocketTimeout异常的Junit代码覆盖率,java,junit,mockito,Java,Junit,Mockito,我的目标是获得适配器类的代码覆盖率。我已经为read SocketTimeoutException(读取超时)编写了Junit测试用例,它没有调用getSampleStatus()方法。如何从我的测试类调用这个getSampleStatus() rest class: =========== class MyAdapter { @Autowired BDSRequestForSubmitGIApp bdsRequestForSubmitGIAp
rest class:
===========
class MyAdapter
{
@Autowired
BDSRequestForSubmitGIApp bdsRequestForSubmitGIApp;
@Autowired
RestTemplate restTemplate;
public BDSSubmitResponse submitGIApplicationToBDS(String channelId,String customerId,String cinSuffix, String countryCode) throws CrossSellOffersException {
BDSSubmitResponse bdsSubmitResponse = null;
try {
bdsSubmitResponse = restTemplate.postForObject(env.getProperty("bds_submit_gi_url"),
bdsRequestForSubmitGIApp, BDSSubmitResponse.class);
} catch (ResourceAccessException e) {
if (e.getCause().getClass().equals(SocketTimeoutException.class)) {
retrun getSampleStatus();// Junit is not covering this line
} else {
throw new CrossSellOffersException("DOMAIN_CONNECT_FAILURE",
"Couldn’t contact domain sub-system(s). Please try after some time.");
}
}
return bdsSubmitResponse;
}
private BDSSubmitResponse getSampleStatus(){
//business logic
}
}
Junit :
=======
@RunWith(MockitoJUnitRunner.class)
class MyAdapterTest
{
@InjectMocks
private MyAdapter crossSellOffersBDSAdapter;
@Mock
private RestTemplate restTemplate;
@Mock
BDSRequestForSubmitGIApp bdsRequestForSubmitGIApp;
@Test
public void submitGIApplicationToBDSReadTimeoutTest() throws Exception {
final String ERROR_MESSAGE =
"I/O error on POST request for \"https://message-publisher.uat.apps.cs.sgp.dbs.com/message\": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out";
Mockito.when(env.getProperty("bds_submit_gi_url")).thenReturn("https://message-publisher.uat.apps.cs.sgp.dbs.com/message");
Mockito.when(restTemplate.postForObject(env.getProperty("bds_submit_gi_url"),
bdsRequestForSubmitGIApp, BDSSubmitResponse.class)).thenThrow(new ResourceAccessException(ERROR_MESSAGE));
BDSSubmitResponse response = crossSellOffersBDSAdapter.submitGIApplicationToBDS(requestBody, "MBSG", "S9718016D", "00");
}
}
如何获得getSampleStatus()方法的代码覆盖率?只需让您的模拟抛出SocketTimeoutException即可
when(restTemplate.postForObject(
env.getProperty("bds_submit_gi_url"),
bdsRequestForSubmitGIApp,
BDSSubmitResponse.class)
).thenThrow(new SocketTimeoutException(ERROR_MESSAGE));
org.springframework.web.client包中存在的ResourceAccessException类及其构造函数是 ResourceAccessException(字符串消息) ResourceAccessException(字符串msg,IOException ex) 下面的测试用例将适用于ResourceAccessException
@Test(expected = CrossSellOffersFulFilmentException.class)
public void submitGIApplicationToBDSExceptionTest() throws Exception {
//Given
final String ERROR_MESSAGE = "ResourceAccessException";
IOException exception = new IOException("IO exception");
//When
Mockito.when(env.getProperty("bds_submit_gi_url")).thenReturn("https://message-publisher.uat.apps.cs.sgp.dbs.com/message");
Mockito.when(restTemplate.postForObject(env.getProperty("bds_submit_gi_url"),
bdsRequestForSubmitGIApp, BDSSubmitResponse.class)).thenThrow(new ResourceAccessException(ERROR_MESSAGE, exception));
//Then
crossSellOffersBDSAdapter.submitGIApplicationToBDS(requestBody, "MBSG", "S9718016D", "00");
}
若我在rest模板中使用SocketTimeoutException,那个么我将得到下面的异常,它并没有覆盖getSampleStatus()方法org.mockito.exceptions.base.MockitoException:选中的异常对此方法无效!无效:java.net.SocketTimeoutException:对“”的POST请求发生I/O错误:读取超时;嵌套异常为java.net.SocketTimeoutException:com.dbs.crossselloffers.adapter.MyAdapterAdapterAdapterTest.SubmitgiaApplicationToBDsExceptionTest(MyAdapterAdapterAdapterTest.java:15)处的读取超时