This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch 2.13.x in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 57f6c57e057481afd2c0f930f330d1fbf7bee214 Author: JiriOndrusek <ondrusek.j...@gmail.com> AuthorDate: Tue Jan 3 16:12:34 2023 +0100 DoBeforeEach does not work with Advice #4362 --- docs/modules/ROOT/pages/user-guide/testing.adoc | 4 +- .../ProducedRouteBuilderET.java} | 54 +++++++------ .../ProducedRouteBuilderTest.java | 61 +++++++++++++++ .../camel/quarkus/test/AfterAllCallback.java | 2 +- .../camel/quarkus/test/AfterEachCallback.java | 8 +- .../camel/quarkus/test/BeforeEachCallback.java | 1 + .../quarkus/test/CamelQuarkusTestSupport.java | 21 ++++++ .../quarkus/test/junit5/CamelTestSupportTest.java | 2 - .../junit5/patterns/IsMockEndpointsFileTest.java | 2 - .../RouteBuilderConfigureExceptionTest.java | 2 - .../AdviceInDoBeforeEachMethodsTest.java | 88 ++++++++++++++++++++++ 11 files changed, 210 insertions(+), 35 deletions(-) diff --git a/docs/modules/ROOT/pages/user-guide/testing.adoc b/docs/modules/ROOT/pages/user-guide/testing.adoc index 6fa7b4e79a..c595e5596d 100644 --- a/docs/modules/ROOT/pages/user-guide/testing.adoc +++ b/docs/modules/ROOT/pages/user-guide/testing.adoc @@ -258,9 +258,9 @@ Be aware that execution of method `doAfterConstruct` differs from the execution * To force Quarkus JUnit Extension to restart the application (and thus also `CamelContext`) for a given test class, you need to assign a unique `@io.quarkus.test.junit.TestProfile` to that class. Check the https://quarkus.io/guides/getting-started-testing#testing_different_profiles[Quarkus documentation] for how you can do that. (Note that `https://quarkus.io/guides/getting-started-testing#quarkus-test-resource[@io.quarkus.test.common.QuarkusTestResource]` has a similar effect.) * Camel Quarkus executes the production of beans during the build phase. Because all the tests are build together, exclusion behavior is implemented into `CamelQuarkusTestSupport`. If a producer of the specific type and name is used in one tests, the instance will be the same for the rest of the tests. -* JUnit Jupiter callbacks (`BeforeEachCallback`, `AfterEachCallback`, `AfterAllCallback`, `BeforeAllCallback`, `BeforeTestExecutionCallback` and `AfterTestExecutionCallback`) might not work correctly. See the https://quarkus.io/guides/getting-started-testing#enrichment-via-quarkustestcallback[documentation]. +* JUnit Jupiter callbacks (`BeforeEachCallback`, `AfterEachCallback`, `AfterAllCallback`, `BeforeAllCallback`, `BeforeTestExecutionCallback` and `AfterTestExecutionCallback`) and JUnit Jupiter annotations (`@BeforeEach`, `@AfterEach`, `@AfterAll` and `@BeforeAll`) might not work correctly. See the https://quarkus.io/guides/getting-started-testing#enrichment-via-quarkustestcallback[documentation]. * If there is an unaffected route, when using advice with, it's important to execute method `CamelQuarkusTestSupport.startRouteDefinitions()` manually from the unit test after you are done doing all the advice with - +* Do not use `@Produces` with `RouteBuilder` use the overridden method `createRouteBuilder()` instead. `@Produces` with `RouteBuilder` might not work correctly. [source,java] ---- diff --git a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/RouteBuilderConfigureExceptionTest.java b/test-framework/junit5-extension-tests/src/test/java/org/apache/camel/quarkus/test/extensions/producedRouteBuilder/ProducedRouteBuilderET.java similarity index 51% copy from test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/RouteBuilderConfigureExceptionTest.java copy to test-framework/junit5-extension-tests/src/test/java/org/apache/camel/quarkus/test/extensions/producedRouteBuilder/ProducedRouteBuilderET.java index cfb26bddca..184d46a2cb 100644 --- a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/RouteBuilderConfigureExceptionTest.java +++ b/test-framework/junit5-extension-tests/src/test/java/org/apache/camel/quarkus/test/extensions/producedRouteBuilder/ProducedRouteBuilderET.java @@ -14,43 +14,53 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.quarkus.test.junit5.patterns; +package org.apache.camel.quarkus.test.extensions.producedRouteBuilder; + +import javax.enterprise.inject.Produces; import io.quarkus.test.junit.QuarkusTest; -import org.apache.camel.Predicate; +import org.apache.camel.builder.AdviceWith; +import org.apache.camel.builder.AdviceWithRouteBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.quarkus.test.CamelQuarkusTestSupport; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.fail; - @QuarkusTest -public class RouteBuilderConfigureExceptionTest extends CamelQuarkusTestSupport { +public class ProducedRouteBuilderET extends CamelQuarkusTestSupport { - private Predicate iAmNull; - - @Override @BeforeEach - public void setUp() { - try { - super.setUp(); - fail("Should have thrown exception"); - } catch (Exception e) { - // expected - } - } - - @Test - public void testFoo() { + public void doSomethingBefore() throws Exception { + AdviceWith.adviceWith(this.context, "sampleRoute", + ProducedRouteBuilderET::enhanceRoute); } - @Override - protected RouteBuilder createRouteBuilder() { + @Produces + public RouteBuilder routes() { return new RouteBuilder() { + @Override public void configure() { - from("direct:start").choice().when(iAmNull).to("mock:dead"); + from("direct:in").routeId("sampleRoute").to("file:target/data/RouteBuilderET?filename=hello_true.txt"); } }; } + + @Test + public void firstTest() throws Exception { + Assertions.assertTrue(true); + } + + @Test + public void secondTest() throws Exception { + Assertions.assertTrue(true); + } + + private static void enhanceRoute(AdviceWithRouteBuilder route) { + route.replaceFromWith("direct:ftp"); + route.interceptSendToEndpoint("file:.*samples.*") + .skipSendToOriginalEndpoint() + .to("mock:file:sample_requests"); + } + } diff --git a/test-framework/junit5-extension-tests/src/test/java/org/apache/camel/quarkus/test/extensions/producedRouteBuilder/ProducedRouteBuilderTest.java b/test-framework/junit5-extension-tests/src/test/java/org/apache/camel/quarkus/test/extensions/producedRouteBuilder/ProducedRouteBuilderTest.java new file mode 100644 index 0000000000..17fa9029a2 --- /dev/null +++ b/test-framework/junit5-extension-tests/src/test/java/org/apache/camel/quarkus/test/extensions/producedRouteBuilder/ProducedRouteBuilderTest.java @@ -0,0 +1,61 @@ +/* + * 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.quarkus.test.extensions.producedRouteBuilder; + +import java.util.function.Supplier; + +import io.quarkus.test.ContinuousTestingTestUtils; +import io.quarkus.test.QuarkusDevModeTest; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +/** + * Test for https://github.com/apache/camel-quarkus/issues/4362 + */ +public class ProducedRouteBuilderTest { + + @RegisterExtension + static final QuarkusDevModeTest TEST = new QuarkusDevModeTest() + .setArchiveProducer(new Supplier<>() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class) + .add(new StringAsset( + ContinuousTestingTestUtils.appProperties("camel-quarkus.junit5.message=Sheldon")), + "application.properties"); + } + }) + .setTestArchiveProducer(new Supplier<>() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class).addClasses(ProducedRouteBuilderET.class); + } + }); + + @Test + public void checkTests() { + ContinuousTestingTestUtils utils = new ContinuousTestingTestUtils(); + ContinuousTestingTestUtils.TestStatus ts = utils.waitForNextCompletion(); + + Assertions.assertEquals(1L, ts.getTestsFailed()); + Assertions.assertEquals(1L, ts.getTestsPassed()); + } +} diff --git a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterAllCallback.java b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterAllCallback.java index 011e008b70..f6cb1f84be 100644 --- a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterAllCallback.java +++ b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterAllCallback.java @@ -27,8 +27,8 @@ public class AfterAllCallback implements QuarkusTestAfterAllCallback { CamelQuarkusTestSupport testInstance = (CamelQuarkusTestSupport) context.getTestInstance(); if (CallbackUtil.isPerClass(testInstance)) { - CallbackUtil.resetContext(testInstance); testInstance.internalAfterAll(context); + CallbackUtil.resetContext(testInstance); } try { diff --git a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterEachCallback.java b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterEachCallback.java index dcf78de57c..eb4e43a089 100644 --- a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterEachCallback.java +++ b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/AfterEachCallback.java @@ -26,15 +26,15 @@ public class AfterEachCallback implements QuarkusTestAfterEachCallback { if (context.getTestInstance() instanceof CamelQuarkusTestSupport) { CamelQuarkusTestSupport testInstance = (CamelQuarkusTestSupport) context.getTestInstance(); - if (!CallbackUtil.isPerClass(testInstance)) { - CallbackUtil.resetContext(testInstance); - } - try { + testInstance.tearDown(); testInstance.doAfterEach(context); } catch (Exception e) { throw new RuntimeException(e); + } + if (!CallbackUtil.isPerClass(testInstance)) { + CallbackUtil.resetContext(testInstance); } } } diff --git a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/BeforeEachCallback.java b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/BeforeEachCallback.java index f7903726b0..93ac9e34e7 100644 --- a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/BeforeEachCallback.java +++ b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/BeforeEachCallback.java @@ -36,6 +36,7 @@ public class BeforeEachCallback implements QuarkusTestBeforeEachCallback { try { testInstance.internalBeforeEach(mockContext); testInstance.internalBeforeAll(mockContext); + testInstance.setUp(); testInstance.doBeforeEach(context); } catch (Exception e) { throw new RuntimeException(e); diff --git a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/CamelQuarkusTestSupport.java b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/CamelQuarkusTestSupport.java index b0eccd5cb8..66276fa398 100644 --- a/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/CamelQuarkusTestSupport.java +++ b/test-framework/junit5/src/main/java/org/apache/camel/quarkus/test/CamelQuarkusTestSupport.java @@ -219,6 +219,27 @@ public class CamelQuarkusTestSupport extends CamelTestSupport //in camel-quarkus, junit5 uses different classloader, necessary code was moved into quarkus's callback } + /** + * Method {@link CamelTestSupport#setUp()} is triggered via annotation {@link org.junit.jupiter.api.BeforeEach}. + * Its execution is disabled (by using overriding method without any annotation) and is executed from + * {@link BeforeEachCallback} + */ + @Override + public void setUp() throws Exception { + super.setUp(); + } + + /** + * Method {@link CamelTestSupport#tearDown()} is triggered via annotation + * {@link org.junit.jupiter.api.AfterEach}. + * Its execution is disabled (by using overriding method without any annotation) and is executed from + * {@link AfterEachCallback} + */ + @Override + public void tearDown() throws Exception { + super.tearDown(); + } + /** * This method stops the Camel context. Be aware that on of the limitation that Quarkus brings is that context * can not be started (lifecycle f the context is bound to the application) . diff --git a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/CamelTestSupportTest.java b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/CamelTestSupportTest.java index 71caa86c36..7c5704eca8 100644 --- a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/CamelTestSupportTest.java +++ b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/CamelTestSupportTest.java @@ -22,7 +22,6 @@ import org.apache.camel.NoSuchEndpointException; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.quarkus.test.CamelQuarkusTestSupport; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -33,7 +32,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; public class CamelTestSupportTest extends CamelQuarkusTestSupport { @Override - @BeforeEach public void setUp() throws Exception { replaceRouteFromWith("routeId", "direct:start"); super.setUp(); diff --git a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/IsMockEndpointsFileTest.java b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/IsMockEndpointsFileTest.java index 3088f11e26..5629296622 100644 --- a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/IsMockEndpointsFileTest.java +++ b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/IsMockEndpointsFileTest.java @@ -21,7 +21,6 @@ import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.quarkus.test.CamelQuarkusTestSupport; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.apache.camel.test.junit5.TestSupport.deleteDirectory; @@ -30,7 +29,6 @@ import static org.apache.camel.test.junit5.TestSupport.deleteDirectory; public class IsMockEndpointsFileTest extends CamelQuarkusTestSupport { @Override - @BeforeEach public void setUp() throws Exception { deleteDirectory("target/input"); deleteDirectory("target/messages"); diff --git a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/RouteBuilderConfigureExceptionTest.java b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/RouteBuilderConfigureExceptionTest.java index cfb26bddca..263adf28f9 100644 --- a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/RouteBuilderConfigureExceptionTest.java +++ b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/junit5/patterns/RouteBuilderConfigureExceptionTest.java @@ -20,7 +20,6 @@ import io.quarkus.test.junit.QuarkusTest; import org.apache.camel.Predicate; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.quarkus.test.CamelQuarkusTestSupport; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.fail; @@ -31,7 +30,6 @@ public class RouteBuilderConfigureExceptionTest extends CamelQuarkusTestSupport private Predicate iAmNull; @Override - @BeforeEach public void setUp() { try { super.setUp(); diff --git a/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/userTestCases/AdviceInDoBeforeEachMethodsTest.java b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/userTestCases/AdviceInDoBeforeEachMethodsTest.java new file mode 100644 index 0000000000..159d352c49 --- /dev/null +++ b/test-framework/junit5/src/test/java/org/apache/camel/quarkus/test/userTestCases/AdviceInDoBeforeEachMethodsTest.java @@ -0,0 +1,88 @@ +/* + * 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.quarkus.test.userTestCases; + +import javax.inject.Inject; + +import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; +import io.quarkus.test.junit.callback.QuarkusTestMethodContext; +import org.apache.camel.CamelContext; +import org.apache.camel.EndpointInject; +import org.apache.camel.Produce; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.builder.AdviceWith; +import org.apache.camel.builder.AdviceWithRouteBuilder; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.quarkus.test.CamelQuarkusTestSupport; +import org.junit.jupiter.api.Test; + +/** + * Test for https://github.com/apache/camel-quarkus/issues/4362 + */ +@QuarkusTest +@TestProfile(AdviceInDoBeforeEachMethodsTest.class) +public class AdviceInDoBeforeEachMethodsTest extends CamelQuarkusTestSupport { + + @Produce("direct:ftp") + protected ProducerTemplate template; + + @Inject + protected CamelContext context; + + @EndpointInject("mock:file:sample_requests") + protected MockEndpoint fileMock; + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + public void configure() { + from("direct:start") + .routeId("sampleRoute") + .to("file:samples/"); + } + }; + } + + @Override + protected void doBeforeEach(QuarkusTestMethodContext context) throws Exception { + AdviceWith.adviceWith(this.context, "sampleRoute", + AdviceInDoBeforeEachMethodsTest::enhanceRoute); + } + + @Test + void testConsumeFtpWriteToFileOne() throws Exception { + fileMock.message(0).body().isEqualTo("Hello World"); + template.sendBody("direct:ftp", "Hello World"); + fileMock.assertIsSatisfied(); + } + + @Test + void testConsumeFtpWriteToFileTwo() throws Exception { + fileMock.message(0).body().isEqualTo("Hello World"); + template.sendBody("direct:ftp", "Hello World"); + fileMock.assertIsSatisfied(); + } + + private static void enhanceRoute(AdviceWithRouteBuilder route) { + route.replaceFromWith("direct:ftp"); + route.interceptSendToEndpoint("file:.*samples.*") + .skipSendToOriginalEndpoint() + .to("mock:file:sample_requests"); + } +}