1

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?

Hareni
  • 15
  • 4
  • Can you show a method you are testing? Error saying that null pointer in getBody() method and you show you mock for restTemplate.exchange(). Can you provide more info please? – Feel free May 16 '23 at 13:10
  • Method that is being tested added, please check, thanks – Hareni May 16 '23 at 14:20

1 Answers1

0

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

Feel free
  • 758
  • 5
  • 15