Я хочу протестировать контракт, в котором одно поле имеет тип 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 представлены по-разному и как я могу описать контракт, который действует в любой момент?