This is an automated email from the ASF dual-hosted git repository. christophd pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit cbf84d90b2fae4fc7bbcad1b5ac1e8f920c475c7 Author: Christoph Deppisch <[email protected]> AuthorDate: Thu Oct 15 13:51:22 2026 +0200 CAMEL-25378: Restore name field with accessor overrides and add missing tests Co-Authored-By: Claude Opus 4.6 <[email protected]> --- .../apache/camel/catalog/components/citrus.json | 2 +- .../camel/catalog/docs/citrus-component.adoc | 13 ++++ .../component/citrus/CitrusEndpointUriFactory.java | 2 +- .../org/apache/camel/component/citrus/citrus.json | 2 +- .../src/main/docs/citrus-component.adoc | 13 ++++ .../camel/component/citrus/CitrusEndpoint.java | 21 +++++- .../citrus/CitrusValidationProcessor.java | 4 +- .../citrus/CitrusReceiveErrorHandlingTest.java | 85 ++++++++++++++++++++++ .../citrus/CitrusSequentialValidationTest.java | 14 ++++ .../camel/component/citrus/CitrusVariableTest.java | 85 ++++++++++++++++++++++ .../builder/endpoint/StaticEndpointBuilders.java | 10 ++- .../endpoint/dsl/CitrusEndpointBuilderFactory.java | 10 ++- 12 files changed, 243 insertions(+), 18 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/citrus.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/citrus.json index 76941d15c7f3..058471240c86 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/citrus.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/citrus.json @@ -31,7 +31,7 @@ }, "properties": { "operation": { "index": 0, "kind": "path", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "java.lang.String", "enum": [ "validate", "receive" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform. 'validate' validates exchanges without modifying them. 'receive' validates exchanges and returns a simulated response." }, - "name": { "index": 1, "kind": "path", "displayName": "Name", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Name of mock endpoint" }, + "name": { "index": 1, "kind": "path", "displayName": "Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "A unique name to identify this endpoint. Allows multiple Citrus endpoints with different validation expectations in the same route." }, "assertPeriod": { "index": 2, "kind": "parameter", "displayName": "Assert Period", "group": "producer", "label": "producer", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a grace period after which the mock will re-assert to ensure the preliminary assertion is still valid. This is used, for example, to assert that exactly a number of messages arrive. For example, if the expected count was set [...] "expectedCount": { "index": 3, "kind": "parameter", "displayName": "Expected Count", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "description": "Specifies the expected number of message exchanges that should be received by this mock. Beware: If you want to expect that 0 messages, then take extra care, as 0 matches when the tests starts, so you need to s [...] "messageType": { "index": 4, "kind": "parameter", "displayName": "Message Type", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The message type for validation. Determines which Citrus validation module is used. Supported values: json, xml, yaml, plaintext." }, diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/citrus-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/citrus-component.adoc index faf89bdbd5c5..3b223533a49f 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/citrus-component.adoc +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/citrus-component.adoc @@ -263,6 +263,8 @@ citrus.assertIsSatisfied(); You can also use `validate(index)` to target a specific exchange by its 1-based position. +Indexed specs (`validate()`, `validate(index)`, `when().receive()`) imply a minimum message count equal to the highest index, unless the test sets `expectedMessageCount(...)` or a larger `expectedMinimumMessageCount(...)`. So `assertIsSatisfied()` fails when fewer exchanges arrive. + When both `validate(index)` and `validateAll()` are configured, the indexed spec takes priority — it replaces `validateAll()` for that exchange entirely (the two are never combined). The `validateAll()` spec acts as a fallback for exchanges that have no matching indexed spec. @@ -381,6 +383,17 @@ citrus.when().receive().then().respond() citrus.expectedMessageCount(1); ---- +=== Error handling and redelivery + +The two operations handle validation failures differently with respect to Camel's error handling: + +* **`validate` operation** — validation failures are captured internally and the exception is + cleared from the exchange. Camel's `onException` handlers and redelivery policies do *not* + trigger. Failures surface only when `assertIsSatisfied()` is called. +* **`receive` operation** — validation failures remain on the exchange as an exception. Camel's + `onException` handlers and redelivery policies *do* trigger, which matches the expected + behavior for a request/response endpoint where callers need to see errors. + === Exchange properties and variables as Citrus variables All exchange properties and exchange variables are automatically propagated to the Citrus test diff --git a/components/camel-test/camel-test-citrus/src/generated/java/org/apache/camel/component/citrus/CitrusEndpointUriFactory.java b/components/camel-test/camel-test-citrus/src/generated/java/org/apache/camel/component/citrus/CitrusEndpointUriFactory.java index 64ff55b2ec76..54ed2323f209 100644 --- a/components/camel-test/camel-test-citrus/src/generated/java/org/apache/camel/component/citrus/CitrusEndpointUriFactory.java +++ b/components/camel-test/camel-test-citrus/src/generated/java/org/apache/camel/component/citrus/CitrusEndpointUriFactory.java @@ -60,7 +60,7 @@ public class CitrusEndpointUriFactory extends org.apache.camel.support.component Map<String, Object> copy = copyParameters(properties); uri = buildPathParameter(syntax, uri, "operation", null, true, copy); - uri = buildPathParameter(syntax, uri, "name", null, true, copy); + uri = buildPathParameter(syntax, uri, "name", null, false, copy); uri = buildQueryParameters(uri, copy, encode); return uri; } diff --git a/components/camel-test/camel-test-citrus/src/generated/resources/META-INF/org/apache/camel/component/citrus/citrus.json b/components/camel-test/camel-test-citrus/src/generated/resources/META-INF/org/apache/camel/component/citrus/citrus.json index 76941d15c7f3..058471240c86 100644 --- a/components/camel-test/camel-test-citrus/src/generated/resources/META-INF/org/apache/camel/component/citrus/citrus.json +++ b/components/camel-test/camel-test-citrus/src/generated/resources/META-INF/org/apache/camel/component/citrus/citrus.json @@ -31,7 +31,7 @@ }, "properties": { "operation": { "index": 0, "kind": "path", "displayName": "Operation", "group": "producer", "label": "", "required": true, "type": "enum", "javaType": "java.lang.String", "enum": [ "validate", "receive" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform. 'validate' validates exchanges without modifying them. 'receive' validates exchanges and returns a simulated response." }, - "name": { "index": 1, "kind": "path", "displayName": "Name", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Name of mock endpoint" }, + "name": { "index": 1, "kind": "path", "displayName": "Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "A unique name to identify this endpoint. Allows multiple Citrus endpoints with different validation expectations in the same route." }, "assertPeriod": { "index": 2, "kind": "parameter", "displayName": "Assert Period", "group": "producer", "label": "producer", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a grace period after which the mock will re-assert to ensure the preliminary assertion is still valid. This is used, for example, to assert that exactly a number of messages arrive. For example, if the expected count was set [...] "expectedCount": { "index": 3, "kind": "parameter", "displayName": "Expected Count", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "description": "Specifies the expected number of message exchanges that should be received by this mock. Beware: If you want to expect that 0 messages, then take extra care, as 0 matches when the tests starts, so you need to s [...] "messageType": { "index": 4, "kind": "parameter", "displayName": "Message Type", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The message type for validation. Determines which Citrus validation module is used. Supported values: json, xml, yaml, plaintext." }, diff --git a/components/camel-test/camel-test-citrus/src/main/docs/citrus-component.adoc b/components/camel-test/camel-test-citrus/src/main/docs/citrus-component.adoc index faf89bdbd5c5..3b223533a49f 100644 --- a/components/camel-test/camel-test-citrus/src/main/docs/citrus-component.adoc +++ b/components/camel-test/camel-test-citrus/src/main/docs/citrus-component.adoc @@ -263,6 +263,8 @@ citrus.assertIsSatisfied(); You can also use `validate(index)` to target a specific exchange by its 1-based position. +Indexed specs (`validate()`, `validate(index)`, `when().receive()`) imply a minimum message count equal to the highest index, unless the test sets `expectedMessageCount(...)` or a larger `expectedMinimumMessageCount(...)`. So `assertIsSatisfied()` fails when fewer exchanges arrive. + When both `validate(index)` and `validateAll()` are configured, the indexed spec takes priority — it replaces `validateAll()` for that exchange entirely (the two are never combined). The `validateAll()` spec acts as a fallback for exchanges that have no matching indexed spec. @@ -381,6 +383,17 @@ citrus.when().receive().then().respond() citrus.expectedMessageCount(1); ---- +=== Error handling and redelivery + +The two operations handle validation failures differently with respect to Camel's error handling: + +* **`validate` operation** — validation failures are captured internally and the exception is + cleared from the exchange. Camel's `onException` handlers and redelivery policies do *not* + trigger. Failures surface only when `assertIsSatisfied()` is called. +* **`receive` operation** — validation failures remain on the exchange as an exception. Camel's + `onException` handlers and redelivery policies *do* trigger, which matches the expected + behavior for a request/response endpoint where callers need to see errors. + === Exchange properties and variables as Citrus variables All exchange properties and exchange variables are automatically propagated to the Citrus test diff --git a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java index 614059cc7626..bf58be0ad4df 100644 --- a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java +++ b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java @@ -40,6 +40,10 @@ public class CitrusEndpoint extends MockEndpoint { @Metadata(required = true) private String operation; + @UriPath(description = "A unique name to identify this endpoint. Allows multiple Citrus endpoints" + + " with different validation expectations in the same route.") + private String name; + @UriParam(description = "The message type for validation. Determines which Citrus validation module is used." + " Supported values: json, xml, yaml, plaintext.") private String messageType; @@ -146,6 +150,17 @@ public class CitrusEndpoint extends MockEndpoint { // --- Getters and setters --- + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + super.setName(name); + } + public String getOperation() { return operation; } @@ -171,6 +186,8 @@ public class CitrusEndpoint extends MockEndpoint { } public WhenMessageValidationSpec receive(int index) { + // registers a validation-only processor now so receive() without respond() still validates; + // ThenSpec.respond() overwrites this registration with a validation+response processor WhenMessageValidationSpec messageValidationSpec = new WhenMessageValidationSpec(index); whenExchangeReceived(index, createProcessor(messageValidationSpec)); applyImpliedMinimumCount(index); @@ -246,8 +263,4 @@ public class CitrusEndpoint extends MockEndpoint { } } - // --- Validation spec for expected messages --- - - // --- Response spec for simulated responses --- - } diff --git a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java index c9e139140c6e..47af6a7b5510 100644 --- a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java +++ b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java @@ -215,9 +215,7 @@ class CitrusValidationProcessor implements Processor { if (key.startsWith("citrus.") || key.startsWith("CITRUS_")) { continue; } - if (!exchange.getProperties().containsKey(key)) { - exchange.setVariable(key, entry.getValue()); - } + exchange.setVariable(key, entry.getValue()); } } } diff --git a/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusReceiveErrorHandlingTest.java b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusReceiveErrorHandlingTest.java new file mode 100644 index 000000000000..11192d5aa55b --- /dev/null +++ b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusReceiveErrorHandlingTest.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.citrus; + +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit6.CamelTestSupport; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class CitrusReceiveErrorHandlingTest extends CamelTestSupport { + + @Test + void validateOperationDoesNotTriggerOnException() throws Exception { + CitrusEndpoint citrus = context.getEndpoint("citrus:validate/test?messageType=json", CitrusEndpoint.class); + MockEndpoint handled = context.getEndpoint("mock:handled", MockEndpoint.class); + + citrus.validateAll().body("{\"action\": \"expected\"}"); + citrus.expectedMessageCount(1); + handled.expectedMessageCount(0); + + template.sendBody("direct:validate", "{\"action\": \"wrong\"}"); + + handled.assertIsSatisfied(); + assertThat(citrus.getReceivedCounter()).isEqualTo(1); + assertThat(citrus.getFailures()).hasSize(1); + assertThatThrownBy(citrus::assertIsSatisfied) + .isInstanceOf(AssertionError.class); + } + + @Test + void receiveOperationTriggersOnException() throws Exception { + CitrusEndpoint citrus = context.getEndpoint("citrus:receive/service?messageType=json", CitrusEndpoint.class); + MockEndpoint handled = context.getEndpoint("mock:handled", MockEndpoint.class); + + citrus.when().receiveAll() + .body("{\"action\": \"expected\"}") + .then().respond() + .body("{\"result\": \"ok\"}"); + citrus.expectedMessageCount(1); + handled.expectedMessageCount(1); + + template.send("direct:receive", exchange -> { + exchange.getIn().setBody("{\"action\": \"wrong\"}"); + }); + + handled.assertIsSatisfied(); + assertThat(citrus.getReceivedCounter()).isEqualTo(1); + } + + @Override + protected RoutesBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + onException(Exception.class) + .handled(true) + .to("mock:handled"); + + from("direct:validate") + .to("citrus:validate/test?messageType=json"); + + from("direct:receive") + .to("citrus:receive/service?messageType=json"); + } + }; + } +} diff --git a/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusSequentialValidationTest.java b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusSequentialValidationTest.java index 09f98f7e8ae9..9b25baefa07a 100644 --- a/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusSequentialValidationTest.java +++ b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusSequentialValidationTest.java @@ -130,6 +130,20 @@ class CitrusSequentialValidationTest extends CamelTestSupport { .hasCauseInstanceOf(ValidationException.class); } + @Test + void shouldFailWhenImpliedMinimumCountNotMet() { + CitrusEndpoint citrus = context.getEndpoint("citrus:validate/test?messageType=json", CitrusEndpoint.class); + + citrus.validate(1).body("{\"event\": \"first\"}"); + citrus.validate(2).body("{\"event\": \"second\"}"); + citrus.validate(3).body("{\"event\": \"third\"}"); + + template.sendBody("direct:start", "{\"event\": \"first\"}"); + + assertThatThrownBy(citrus::assertIsSatisfied) + .isInstanceOf(AssertionError.class); + } + @Override protected RoutesBuilder createRouteBuilder() { return new RouteBuilder() { diff --git a/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java new file mode 100644 index 000000000000..f3081e8f8ba4 --- /dev/null +++ b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.citrus; + +import org.apache.camel.Exchange; +import org.apache.camel.RoutesBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.test.junit6.CamelTestSupport; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class CitrusVariableTest extends CamelTestSupport { + + @Test + void shouldPropagateExchangeVariableToCitrusContext() throws Exception { + CitrusEndpoint citrus = context.getEndpoint("citrus:validate/test?messageType=json", CitrusEndpoint.class); + + citrus.validateAll().body("{\"greeting\": \"Hello ${userName}!\"}"); + citrus.expectedMessageCount(1); + + template.send("direct:start", exchange -> { + exchange.setVariable("userName", "World"); + exchange.getIn().setBody("{\"greeting\": \"Hello World!\"}"); + }); + + citrus.assertIsSatisfied(); + } + + @Test + void shouldExtractVariableFromBody() throws Exception { + CitrusEndpoint citrus = context.getEndpoint("citrus:validate/test?messageType=json", CitrusEndpoint.class); + + citrus.validateAll().body("{\"orderId\": \"@variable('extractedId')@\", \"status\": \"created\"}"); + citrus.expectedMessageCount(1); + + Exchange result = template.send("direct:start", exchange -> { + exchange.getIn().setBody("{\"orderId\": \"ABC-123\", \"status\": \"created\"}"); + }); + + citrus.assertIsSatisfied(); + assertThat(result.getVariable("extractedId")).isEqualTo("ABC-123"); + } + + @Test + void shouldExtractVariableEvenWhenPropertyExists() throws Exception { + CitrusEndpoint citrus = context.getEndpoint("citrus:validate/test?messageType=json", CitrusEndpoint.class); + + citrus.validateAll().body("{\"orderId\": \"@variable('orderId')@\", \"status\": \"ok\"}"); + citrus.expectedMessageCount(1); + + Exchange result = template.send("direct:start", exchange -> { + exchange.setProperty("orderId", "old-value"); + exchange.getIn().setBody("{\"orderId\": \"new-value\", \"status\": \"ok\"}"); + }); + + citrus.assertIsSatisfied(); + assertThat(result.getVariable("orderId")).isEqualTo("new-value"); + assertThat(result.getProperty("orderId")).isEqualTo("old-value"); + } + + @Override + protected RoutesBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + from("direct:start").to("citrus:validate/test?messageType=json"); + } + }; + } +} diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java index 9d1bf697ccc6..bef527f62ada 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java @@ -3390,8 +3390,9 @@ public class StaticEndpointBuilders { * response. * There are 2 enums and the value can be one of: validate, receive * - * Path parameter: name (required) - * Name of mock endpoint + * Path parameter: name + * A unique name to identify this endpoint. Allows multiple Citrus endpoints + * with different validation expectations in the same route. * * @param path operation/name * @return the dsl builder @@ -3415,8 +3416,9 @@ public class StaticEndpointBuilders { * response. * There are 2 enums and the value can be one of: validate, receive * - * Path parameter: name (required) - * Name of mock endpoint + * Path parameter: name + * A unique name to identify this endpoint. Allows multiple Citrus endpoints + * with different validation expectations in the same route. * * @param componentName to use a custom component name for the endpoint * instead of the default name diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CitrusEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CitrusEndpointBuilderFactory.java index 5c1bcbe5036b..57bbadf83f6b 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CitrusEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CitrusEndpointBuilderFactory.java @@ -592,8 +592,9 @@ public interface CitrusEndpointBuilderFactory { * response. * There are 2 enums and the value can be one of: validate, receive * - * Path parameter: name (required) - * Name of mock endpoint + * Path parameter: name + * A unique name to identify this endpoint. Allows multiple Citrus + * endpoints with different validation expectations in the same route. * * @param path operation/name * @return the dsl builder @@ -617,8 +618,9 @@ public interface CitrusEndpointBuilderFactory { * response. * There are 2 enums and the value can be one of: validate, receive * - * Path parameter: name (required) - * Name of mock endpoint + * Path parameter: name + * A unique name to identify this endpoint. Allows multiple Citrus + * endpoints with different validation expectations in the same route. * * @param componentName to use a custom component name for the endpoint * instead of the default name
