[java] Java Cucumber에서 요청 스파이하기

Java 프로젝트에서 API 테스트를 작성할 때 종종 요청이 올바르게 전송되고 있는지 확인해야 할 때가 있습니다. Cucumber의 스텝 정의에서 요청을 스파이(spy)하여 이를 확인할 수 있습니다. 이 글에서는 Java Cucumber에서 요청을 스파이하는 방법에 대해 알아보겠습니다.

1. 예제 시나리오

예를 들어, 다음과 같은 시나리오를 가정해 봅시다:

Feature: 요청 스파이하기
  Scenario: 유효한 요청 확인
    Given 사용자가 로그인한 상태이고
    When 유효한 POST 요청이 전송될 때
    Then 요청이 스파이되었는지 확인할 수 있다

2. 스텝 정의 작성

스텝 정의에서는 요청을 스파이하고, 스파이한 결과를 검증할 수 있도록 코드를 작성해야 합니다. 아래는 해당 스텝 정의의 예입니다:

import io.cucumber.java.Before;
import io.cucumber.java.Scenario;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;

import org.springframework.http.MediaType;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpEntity;
import org.springframework.web.client.RestTemplate;

import java.util.Objects;

public class RequestSpyingSteps {

  private RestTemplate restTemplate;
  private ResponseEntity<?> responseEntity;
  private Scenario scenario;
  private HttpHeaders requestHeaders;

  @Before
  public void before(Scenario scenario) {
    this.scenario = scenario;
  }

  @Given("사용자가 로그인한 상태이고")
  public void userIsLoggedIn() {
    // 사용자가 로그인한 상태인 것을 가정합니다.
  }

  @When("유효한 POST 요청이 전송될 때")
  public void sendValidPostRequest() {
    String requestBody = "{}"; // 유효한 요청 본문
    String apiUrl = "http://localhost:8080/api";
    
    requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.APPLICATION_JSON);
    
    HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, requestHeaders);

    restTemplate = new RestTemplate();
    responseEntity = restTemplate.exchange(apiUrl, HttpMethod.POST, requestEntity, String.class);
  }

  @Then("요청이 스파이되었는지 확인할 수 있다")
  public void verifyRequestWasSpied() {
    String requestUrl = "http://localhost:8080/api";
    String requestBody = "{}"; // 예상한 요청 본문

    if (Objects.equals(requestUrl, responseEntity.getRequestHeaders().get(HttpHeaders.HOST).get(0))) {
      scenario.write("요청이 스파이되었습니다.");
      scenario.write("스파이한 요청 내용: " + requestBody);
    } else {
      scenario.write("요청이 스파이되지 않았습니다.");
    }
  }
}

위의 코드에서 sendValidPostRequest 메서드에서 유효한 POST 요청을 전송합니다. 이때 요청이 스파이되어 responseEntity 객체에 저장됩니다. 그리고 verifyRequestWasSpied 메서드에서는 스파이된 요청이 맞는지 검증하고 결과를 Cucumber 시나리오에 기록합니다.

3. Cucumber 실행

모든 스텝 정의를 작성한 후에는 Cucumber를 실행하여 테스트를 수행할 수 있습니다. 터미널에서 다음 명령을 실행합니다:

mvn test

위의 명령을 실행하면 Cucumber가 시나리오에 따라 코드를 실행하고 결과를 출력합니다.

참고 자료

이렇게 Java Cucumber에 요청을 스파이하는 방법에 대해 알아보았습니다. 이 기능을 활용하여 API 테스트 시 요청이 올바르게 전송되었는지 신속하게 확인할 수 있습니다.