Как перехватить запросы Wiremock и условно отправить ответ?

Я использую Wiremock для имитации двух конечных точек. Наш дымовой тест развертывания вызывает третью, диагностическую, конечную точку в приложении для проверки работоспособности основных конечных точек. Мне нужно, чтобы конечная точка Smoketest проверила, что две другие конечные точки работают, вернуть 200 в случае успеха и что-то еще, если нет. Похоже, это либо исключает два возможных результата для одной конечной точки, либо ИЛИ вообще не использует заглушку. Я не могу найти в Wiremock механизм обратного вызова, который может выдавать ответ, но, похоже, это то, что мне нужно.

Как мне это сделать в Wiremock?


person user1332148    schedule 17.07.2019    source источник


Ответы (1)


Ответ - создать подкласс ResponseDefinitionTransformer и встроить условную функциональность в transform переопределение, которое возвращает ResponseDefinition.

Затем вам нужно передать экземпляр подкласса ResponseDefinitionTransformer декоратору WireMockConfiguration extensions.

Если преобразователь не должен применяться к каждому маршруту, вы должны переопределить ResponseDefinitionTransformer.applyGlobally, чтобы вернуть false и передать имя преобразователя ResponseDefinitionBuilder декоратору withTransformers.

Вот пример Scala, демонстрирующий это:

class RouteStubTransformer extends ResponseDefinitionTransformer {

  override def transform(
    request: Request,
    responseDefinition: ResponseDefinition,
    files: FileSource,
    parameters: Parameters): ResponseDefinition = {

    if (someGoodCondition) {
      new ResponseDefinitionBuilder()
        .withHeader("Content-Type", "text/plain; charset=UTF-8")
        .withStatus(200)
        .withBody("""{"message":"ok"}""")
        .build()
    } else {
      new ResponseDefinitionBuilder()
        .withHeader("Content-Type", "text/plain; charset=UTF-8")
        .withStatus(404)
        .withBody("""{"message":"page not found"}""")
        .build()
    }
  }

  override def getName: String = "stub-transformer"

  override def applyGlobally: Boolean = false
}

object WireMockApp {

  val routeStubTransformer = new RouteStubTransformer
  val wireMockConfiguration = WireMockConfiguration
    .options()
    .port(8080)
    .extensions(routeStubTransformer)
  val server = new WireMockServer(wireMockConfiguration)
  server.start()

  server.stubFor(get("/route/to/transform").willReturn(aResponse().withTransformers(routeStubTransformer.getName)))
}
person user1332148    schedule 18.07.2019