exceptionjunitmockitoresponse-entity

Cannot invoke "org.springframework.http.ResponseEntity.getBody()" because "responseEntity" is null


In Mockito test cases, I m facing this response entity is null error which ideally should not be happening as I have mocked the response entity as well.

My Code:

Mockito.when(restTemplate.exchange(ArgumentMatchers.anyString(), Mockito.any(HttpMethod.class), ArgumentMatchers.any(), ArgumentMatchers.<Class<byte[]>>any()))
                    .thenReturn(new ResponseEntity("test".getBytes(),HttpStatus.OK));

Error: java.lang.NullPointerException: Cannot invoke "org.springframework.http.ResponseEntity.getBody()" because "responseEntity" is null

METHOD:

public void getLetters() {

try {
    List<letters> records =  letterRepository.getletters();
    HttpHeaders headers = httpClientToken.getHeader(
    tokenurl,
    Client,
    Secret,
    Granttype );

    ResponseEntity<byte[]> responseEntity;
    HttpEntity<?> entity = new HttpEntity<>(headers);


    for(int i = 0; i<records.size(); i++) {
       
        
        String Url =  http://localhost:8080/documents/getdocument;

        URI uri = UriComponentsBuilder.fromHttpUrl(Objects.requireNonNull(Url))
                .queryParam("spaceId", records.get(i).letterId)
                 .build()
                .toUri();

                   try {
                    responseEntity = restTemplate.getTemplateAttributesRestTemplate().exchange(uri, HttpMethod.GET, entity, byte[].class);
               
                    InputStream anyInputStream = new ByteArrayInputStream(responseEntity.getBody());
                    str = "C:\\Users\\hm\\Downloads\\letter.pdf”;
                    OutputStream outputStream = new OutputStream(str);

                    copyFile(anyInputStream, outputStream, 1024 * 1024 * 10);
                    
                
        } catch (Exception e) {
            e.printStackTrace();
            
        }        }
}
catch (Exception e){
    e.printStackTrace();
       }
 }

Any idea as to why this error is being thrown and how to resolve it?


Solution

  • As i don't see how you mock a restTemplate I will provide a few more code than it needs:

    @ExtendWith(MockitoExtension.class)
    public class MyClassTest {
        
        @Mock
        private LetterRepository letterRepository;
    
        @Mock
        private HttpClientToken httpClientToken;
    
        @Mock
        private RestTemplate restTemplate;
    
        @InjectMocks
        private MyClass myClass;
    
        @BeforeEach
        public void setUp() {
            MockitoAnnotations.openMocks(this);
        }
    
        @Test
        public void testGetLetters() {
    
            List<Letter> letters = new ArrayList<>();
            letters.add(new Letter("1"));
            letters.add(new Letter("2"));
            when(letterRepository.getLetters()).thenReturn(letters);
    
            HttpHeaders headers = new HttpHeaders();
            when(httpClientToken.getHeader(anyString(), anyString(), anyString(), anyString())).thenReturn(headers);
    
            ResponseEntity<byte[]> responseEntity = new ResponseEntity<>("test".getBytes(), HttpStatus.OK);
            when(restTemplate.exchange(any(URI.class), eq(HttpMethod.GET), any(HttpEntity.class), eq(byte[].class)))
                    .thenReturn(responseEntity);
    
            myClass.getLetters();
    
            verify(letterRepository).getLetters();
            verify(httpClientToken).getHeader(anyString(), anyString(), anyString(), anyString());
            verify(restTemplate, times(letters.size())).exchange(any(URI.class), eq(HttpMethod.GET), any(HttpEntity.class), eq(byte[].class));
        }
    

    Hope it works. Otherway you will need to provide reproducible code