Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ResourceAccessException内部SocketTimeout异常的Junit代码覆盖率_Java_Junit_Mockito - Fatal编程技术网

Java ResourceAccessException内部SocketTimeout异常的Junit代码覆盖率

Java ResourceAccessException内部SocketTimeout异常的Junit代码覆盖率,java,junit,mockito,Java,Junit,Mockito,我的目标是获得适配器类的代码覆盖率。我已经为read SocketTimeoutException(读取超时)编写了Junit测试用例,它没有调用getSampleStatus()方法。如何从我的测试类调用这个getSampleStatus() rest class: =========== class MyAdapter { @Autowired BDSRequestForSubmitGIApp bdsRequestForSubmitGIAp

我的目标是获得适配器类的代码覆盖率。我已经为read SocketTimeoutException(读取超时)编写了Junit测试用例,它没有调用getSampleStatus()方法。如何从我的测试类调用这个getSampleStatus()

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)处的读取超时