0

Mocking RestTemplate.exchange() is not working. The Response of restTemplate.exchange() mocking gives null value at BDS Adapter class. My test case is failing with null pointer exception in BDSAdapter class. (response.getStatusCodeValue() gives null pointer exception..Mockito hints

Unused... -> at com..policydetails_adapters.BDSAdapterTest.getInsuranceHoldings(BDSAdapterTest.java:56) [MockitoHint] ...args ok? -> at com.policydetails_adapters.BDSAdapter.fetchInsuranceDetails(BDSAdapter.java:77)

 Below are my classes.

Test 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;
    }

}

My Actual class

@Component 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;
}

}

durgaPrasad
  • 109
  • 1
  • 3
  • 12

2 Answers2

0

Perhaps, because mock of BDSFetchInsuranceDetailsResponse will return not a class of BDSFetchInsuranceDetailsResponse but some mockclass

Alex
  • 706
  • 7
  • 16
0

Arugments inside restTemplate.exchange() method should match. In this code env.getProperty("bds_fetch_insurance_details_url") returns null which does not match with String. So it gives null response. Added the below statment before When(restTemplate.exchange(-,-,-,-).thenReturn(myResponse). It is working

`Mockito.when(env.getProperty("bds_fetch_insurance_details_url")).thenReturn("anyString")`;
durgaPrasad
  • 109
  • 1
  • 3
  • 12
  • I have the same issue but I couldn't fix it. How can I fix it? Here is the link : https://stackoverflow.com/questions/76308882/spring-boot-junit-test-resttemplate-returns-null-in-servicetest – S.N May 22 '23 at 20:31