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?
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