How to use argument captor for unit test RestTemplate java

Viewed 4
private static final MediaType MULTIPART_FORM_DATA_BOUNDARY = MediaType.valueOf("multipart/form-data;boundary=BOUNDARY");

@Qualifier(REST_TEMPLATE)
private final RestTemplate restTemplate;

private final PojoToMultiValueMapMapper mapper;
private final ClientProperties properties;

public void archivePojo(final Pojo pojo) {
    restTemplate.postForEntity(properties.getUrl(), buildHttpEntity(pojo), Void.class);
}

private HttpEntity<?> buildHttpEntity(final Pojo pojo) {
    HttpHeaders headers = new HttpHeaders();
    headers.add(X_REQUESTING_SYSTEM_KEY, X_REQUESTING_SYSTEM_VALUE);
    headers.setContentType(MULTIPART_FORM_DATA_BOUNDARY);
    return new HttpEntity<>(mapper.map(pojo), headers);
}

How to mock the rest template?

1 Answers
    @Mock
private RestTemplate restTemplate;
@Captor
private ArgumentCaptor<String> urlCaptor;
@Mock
private PojoToMultiValueMapMapper mapper;

@Captor
private ArgumentCaptor<HttpEntity> headersCaptor;

private static final String HEADER_REQUESTING_SYSTEM_KEY = "x-requesting-system";
private static final String EXPECTED_CONTENT_TYPE_VALUE = "multipart/form-data;boundary=BOUNDARY";

@Test
void testHeaderIsPopulated() {

    pojoRestClient.archivePojo(Pojo.builder().build());

    verify(restTemplate).postForEntity(urlCaptor.capture(), headersCaptor.capture(), any());

    assertNotNull(headersCaptor.getValue());
    assertNotNull(headersCaptor.getValue()
            .getHeaders()
            .get(HEADER_REQUESTING_SYSTEM_KEY));
    assertThat(headersCaptor.getValue()
            .getHeaders()
            .getContentType()
            .toString()).hasToString(EXPECTED_CONTENT_TYPE_VALUE);
}
Related