diff --git a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java index bafd2ad923..0c294d5cad 100644 --- a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java +++ b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java @@ -44,14 +44,21 @@ public class OptionalProperty implements Serializable, CanBeDynamic { } public String value() { - if (this.value == null) { + return valueToCheck(this.value).toString(); + } + + private Object valueToCheck(Object value) { + if (value == null) { return ""; } - else if (this.value instanceof RegexProperty) { - return ((RegexProperty) this.value).pattern(); + else if (value instanceof ClientDslProperty) { + return valueToCheck(((ClientDslProperty) value).getClientValue()); + } + else if (value instanceof RegexProperty || value instanceof Pattern) { + return new RegexProperty(value).pattern(); } else { - return this.value.toString(); + return value.toString(); } } diff --git a/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy b/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy index 0f52513ac7..19d6da35ae 100644 --- a/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy +++ b/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/ContractSpec.groovy @@ -464,4 +464,23 @@ then: then: thrown(IllegalStateException) } + + @Issue("1215") + def 'should work fine when dealing with anyOf'() { + when: + Contract.make { + request { + method 'GET' + url '/any' + body ( + foo: $(consumer(optional(anyOf('WORKS','MIGHTY', 'DESPAIR'))), producer('DESPAIR')) + ) + } + response { + status OK() + } + } + then: + noExceptionThrown() + } }