Как использовать шаблон ответа WireMock в тестах JUnit 5 - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь использовать функцию Templating Response в WireMock, но, похоже, она не работает с примером кода, предоставленным в документации.

Это пример кусок кода:


import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
import io.restassured.RestAssured;
import org.hamcrest.Matchers;
import org.junit.Rule;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class WireMockTest {

  @Rule
  public WireMockRule wm = new WireMockRule(options()
      .extensions(new ResponseTemplateTransformer(true)));
  private WireMockServer wireMockServer;

  @BeforeEach
  public void setup() {
    this.wireMockServer = new WireMockServer(
        options().port(8081));
    this.wireMockServer.stubFor(get(urlEqualTo("/test-url"))
        .willReturn(aResponse()
            .withBody("{{request.url}}")
            .withTransformers("response-template")));
    this.wireMockServer.start();
  }

  @Test
  public void test() {
    RestAssured.when()
        .get("http://localhost:8081/test-url")
        .then()
        .log().ifError()
        .body(Matchers.equalTo("/test-url"));
  }

  @AfterEach
  public void tearDown() {
    wireMockServer.stop();
  }
}

Ожидаемый результат:

Тесты должны пройти. (то есть {{request.url}} должен быть заменен /test-url в результате рендеринга шаблона).

Фактический результат:

....

java.lang.AssertionError: 1 expectation failed.
Response body doesn't match expectation.
Expected: "/test-url"
  Actual: {{request.url}}

То, что я пробовал:

  1. Поскольку это тестовые случаи, использующие API JUnit 5, я не добавил @Rule WireMockRule, вместо этого добавил .withTransformers("response-template").
  2. Попытался изменить тестовые случаи для использования JUnit 4 API и добавил
@Rule
public WireMockRule wm = new WireMockRule(options()
    .extensions(new ResponseTemplateTransformer(false))
);

(вместе с withTransformers)
3. Изменил WireMockRule на

@Rule
public WireMockRule wm = new WireMockRule(options()
    .extensions(new ResponseTemplateTransformer(true))
);

(вместе с трансформаторами)
4. Убрал withTransformers, сохранив только WireMockRule. (JUnit 4)
5. Я также пробовал вышеупомянутую комбинацию с JUnit 5. API.

Но ни один из вышеупомянутых вариантов не работал. Я что-то пропустил?

1 Ответ

1 голос
/ 09 марта 2020

Подход @Rule не будет работать, потому что вы игнорируете WireMockServer, созданный / управляемый правилом te, так как вы создаете новый самостоятельно в @BeforeEach.

Вы должны удалить правило и добавить ResponseTemplateTransformer в вашем @BeforeEach к WireMockServer через Options объект.

Нечто подобное должно сработать (судя по Javado c).

@BeforeEach
  public void setup() {
    this.wireMockServer = new WireMockServer(
        options()
          .extensions(new ResponseTemplateTransformer(false))
          .port(8081));
    this.wireMockServer.stubFor(get(urlEqualTo("/test-url"))
        .willReturn(aResponse()
            .withBody("{{request.url}}")
            .withTransformers("response-template")));
    this.wireMockServer.start();
  }
...