Как я могу протестировать весенне-облачный контракт, содержащий поле java.time.Instant - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу протестировать контракт, в котором одно поле имеет тип java.time.Instant. Но не все случаи Мгновенного действия обрабатываются, как я ожидаю, по контракту «весеннее облако». Учитывая следующий простой договор:

Contract.make {
  description("Get a version")
  request {
    method 'GET'
    url '/config/version'
    headers {
      contentType(applicationJson())
    }
  }
  response {
    status 200
    body(
      nr: 42,
      creationDate: producer(anyIso8601WithOffset())
    )
    headers {
      contentType(applicationJson())
    }
  }
}

А это реализация сервиса:

@RestController
public class VersionController {
  @GetMapping(path = "/version")

  public ResponseEntity<Version> getCurrentVersion() {
    return ResponseEntity.ok(new Version(42, Instant.ofEpochMilli(0)));
  }
}

Выполнение теста gradle работает нормально. Но если я заменил Instant на Instant.now (), мой провайдерский тест провалится с

java.lang.IllegalStateException: Parsed JSON [{"nr":42,"creationDate":"2018-11-11T15:28:26.958284Z"}] doesn't match the JSON path [$[?(@.['creationDate'] =~ /([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.\d{3})?(Z|[+-][01]\d:[0-5]\d)/)]]

, что понятно, поскольку Instant.now () создает Instant, чье строковое представление действительно не соответствует шаблону anyIso8601WithOffset(). Но почему это? Почему Instants представлены по-разному и как я могу описать контракт, который действует в любой момент?

1 Ответ

0 голосов
/ 11 ноября 2018

Хорошо, я нашел решение, которое работает для меня. Хотя я не знаю, так ли это.

Чтобы всегда получать один и тот же формат сериализованного момента, я определяю формат соответствующего свойства моего компонента версии следующим образом:

public class Version {
  private final int nr;
  private final Instant creationDate;

  @JsonCreator
  public Version(
    @JsonProperty("nr") int nr,
    @JsonProperty("creationDate") Instant creationDate)
  {
    this.nr = nr;
    this.creationDate = creationDate;
  }

  public int getNr() {
    return nr;
  }

  @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "UTC")
  public Instant getCreationDate() {
    return creationDate;
  }
} 
...