Как проверить, правильно ли добавлены заголовки в HTTP-запрос - PullRequest
0 голосов
/ 10 октября 2019

У меня есть такой метод:

@Service
public class ProductFacadeImpl implements ProductFacade {

  private NutritionixHeader nutritionHeaderParam;
  private RestTemplate restTemplate;

  public ProductFacadeImpl(NutritionixHeader nutritionHeaderParam, RestTemplate restTemplate) {
    this.nutritionHeaderParam = nutritionHeaderParam;
    this.restTemplate = restTemplate;
  }

  public HttpEntity addUniversalHeaderForRequest() {

    HttpHeaders headers = new HttpHeaders();
    headers.set("x-app-id", nutritionHeaderParam.getNutritionixAppId());
    headers.set("x-app-key", nutritionHeaderParam.getNutritionixAppKey());

    return new HttpEntity(headers);
  }
}

Я хочу проверить, правильно ли мой метод добавляет заголовки в HTTP-запрос.

Мой тест выглядит так:

@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class ProductFacadeImplTest {

  @Mock
  private NutritionixHeader nutritionixHeader;

  @Mock
  private RestTemplate restTemplate;

  @InjectMocks
  private ProductFacadeImpl productFacadeImpl;

  @Mock
  private UriComponentsBuilder uriComponentsBuilder;

  @Mock
  private ResponseEntity responseEntity;

  @Mock
  private HttpHeaders httpHeaders;

  @BeforeEach
  void setUp() {
    productFacadeImpl = new ProductFacadeImpl(nutritionixHeader, restTemplate);
  }

  @Test
  void addUniversalHeaderForRequest() {
    //given
    given(nutritionixHeader.getNutritionixAppId()).willReturn("id");
    given(nutritionixHeader.getNutritionixAppKey()).willReturn("key");

    //when
    productFacadeImpl.addUniversalHeaderForRequest();

    ArgumentCaptor<HttpEntity> httpEntityCapture = ArgumentCaptor.forClass(HttpEntity.class);
    ArgumentCaptor<HttpHeaders> httpHeadersCaptor = ArgumentCaptor.forClass(HttpHeaders.class);

    verify(httpHeaders).set(eq("x-app-id"), eq("id"));
    verify(httpHeaders).set(eq("x-app-key"), eq("key"));

    HttpHeaders headers = httpEntityCapture.getValue().getHeaders();

    assertEquals("id",
        headers.entrySet()
            .stream()
            .filter(entry -> entry.getKey().equals("x-app-id"))
            .map(Entry::getValue)
            .flatMap(Collection::stream)
            .findFirst()
            .orElse(""));
  }
}

, но когда я запускаю его, я получаю информацию вроде:

Wanted but not invoked:
httpHeaders.set("x-app-id", "id");
-> at com.application.nutritionix.service.ProductFacadeImplTest.addUniversalHeaderForRequest(ProductFacadeImplTest.java:196)
Actually, there were zero interactions with this mock.

Я знаю, что я предполагаю использовать ArgumentCaptor но я не могу определить, как правильно использовать httpEntityCapture для решения этого примера. Спасибо за ваши предложения о том, как достичь цели.

...