You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/10/24 14:54:33 UTC

[camel] branch master updated: CAMEL-15661: use Testcontainers and Azurite at integration tests (#4507)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new c2ee8e2  CAMEL-15661: use Testcontainers and Azurite at integration tests (#4507)
c2ee8e2 is described below

commit c2ee8e278e44a7e65c701dbd3502991f9fcaa3ad
Author: Denis Istomin <is...@gmail.com>
AuthorDate: Sat Oct 24 19:54:10 2020 +0500

    CAMEL-15661: use Testcontainers and Azurite at integration tests (#4507)
---
 .../catalog/docs/azure-storage-blob-component.adoc |   6 +-
 components/camel-azure-storage-blob/pom.xml        |  41 +++------
 .../main/docs/azure-storage-blob-component.adoc    |   6 +-
 .../azure/storage/blob/BlobTestUtils.java          |  20 ++---
 .../azure/storage/blob/integration/BaseIT.java     | 100 +++++++++++++++++++++
 .../BlobConsumerITTest.java}                       |  65 +++++---------
 .../BlobContainerOperationsITTest.java}            |  24 ++---
 .../BlobOperationsITTest.java}                     |  25 ++----
 .../BlobProducerITTest.java}                       |  44 ++-------
 .../src/test/resources/azurite.properties          |  19 ++++
 .../ROOT/pages/azure-storage-blob-component.adoc   |   6 +-
 11 files changed, 189 insertions(+), 167 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/azure-storage-blob-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/azure-storage-blob-component.adoc
index 5180175..1b84770 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/azure-storage-blob-component.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/azure-storage-blob-component.adoc
@@ -685,8 +685,10 @@ from("direct:start")
 
 
 === Development Notes (Important)
-When developing on this component, you will need to obtain your Azure accessKey in order to run the integration tests. In addition to the mocked unit tests
-you *will need to run the integration tests with every change you make or even client upgrade as the Azure client can break things even on minor versions upgrade.*
+All integration tests use [Testcontainers](https://www.testcontainers.org/) and run by default.
+Obtaining of Azure accessKey and accountName is needed to be able to run all integration tests using Azure services.
+In addition to the mocked unit tests you *will need to run the integration tests
+with every change you make or even client upgrade as the Azure client can break things even on minor versions upgrade.*
 To run the integration tests, on this component directory, run the following maven command:
 ----
 mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey
diff --git a/components/camel-azure-storage-blob/pom.xml b/components/camel-azure-storage-blob/pom.xml
index 7927199..7332b98 100644
--- a/components/camel-azure-storage-blob/pom.xml
+++ b/components/camel-azure-storage-blob/pom.xml
@@ -81,34 +81,17 @@
             <artifactId>awaitility</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>testcontainers</artifactId>
+            <version>${testcontainers-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>${testcontainers-version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
-    <profiles>
-        <profile>
-            <id>fullTests</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <version>${maven-surefire-plugin-version}</version>
-                        <executions>
-                            <execution>
-                                <phase>integration-test</phase>
-                                <goals>
-                                    <goal>test</goal>
-                                </goals>
-                                <configuration>
-                                    <excludes>
-                                        <exclude>none</exclude>
-                                    </excludes>
-                                    <includes>
-                                        <include>**/*IT</include>
-                                    </includes>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
 </project>
diff --git a/components/camel-azure-storage-blob/src/main/docs/azure-storage-blob-component.adoc b/components/camel-azure-storage-blob/src/main/docs/azure-storage-blob-component.adoc
index 5180175..1b84770 100644
--- a/components/camel-azure-storage-blob/src/main/docs/azure-storage-blob-component.adoc
+++ b/components/camel-azure-storage-blob/src/main/docs/azure-storage-blob-component.adoc
@@ -685,8 +685,10 @@ from("direct:start")
 
 
 === Development Notes (Important)
-When developing on this component, you will need to obtain your Azure accessKey in order to run the integration tests. In addition to the mocked unit tests
-you *will need to run the integration tests with every change you make or even client upgrade as the Azure client can break things even on minor versions upgrade.*
+All integration tests use [Testcontainers](https://www.testcontainers.org/) and run by default.
+Obtaining of Azure accessKey and accountName is needed to be able to run all integration tests using Azure services.
+In addition to the mocked unit tests you *will need to run the integration tests
+with every change you make or even client upgrade as the Azure client can break things even on minor versions upgrade.*
 To run the integration tests, on this component directory, run the following maven command:
 ----
 mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey
diff --git a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobTestUtils.java b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobTestUtils.java
index fb1dbeb..2548bcd 100644
--- a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobTestUtils.java
+++ b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobTestUtils.java
@@ -26,26 +26,18 @@ public final class BlobTestUtils {
     private BlobTestUtils() {
     }
 
-    public static Properties loadAzurePropertiesFile() throws IOException {
+    public static Properties getAzuriteProperties() {
         final Properties properties = new Properties();
-        final String fileName = "azure_key.properties";
+        final String fileName = "azurite.properties";
 
         final InputStream inputStream
                 = Objects.requireNonNull(BlobTestUtils.class.getClassLoader().getResourceAsStream(fileName));
 
-        properties.load(inputStream);
-
-        return properties;
-    }
-
-    public static Properties loadAzureAccessFromJvmEnv() throws Exception {
-        final Properties properties = new Properties();
-        if (System.getProperty("accountName") == null || System.getProperty("accessKey") == null) {
-            throw new Exception(
-                    "Make sure to supply azure accessKey or accountName, e.g:  mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey");
+        try {
+            properties.load(inputStream);
+        } catch (IOException e) {
+            throw new IllegalArgumentException("Could not initialize Azurite properties", e);
         }
-        properties.setProperty("account_name", System.getProperty("accountName"));
-        properties.setProperty("access_key", System.getProperty("accessKey"));
 
         return properties;
     }
diff --git a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BaseIT.java b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BaseIT.java
new file mode 100644
index 0000000..cc14584
--- /dev/null
+++ b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BaseIT.java
@@ -0,0 +1,100 @@
+/*
+ * 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.azure.storage.blob.integration;
+
+import java.util.Properties;
+
+import com.azure.storage.blob.BlobServiceClient;
+import com.azure.storage.blob.BlobServiceClientBuilder;
+import com.azure.storage.common.StorageSharedKeyCredential;
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.azure.storage.blob.BlobConfiguration;
+import org.apache.camel.component.azure.storage.blob.BlobTestUtils;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.TestInstance;
+import org.testcontainers.containers.GenericContainer;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class BaseIT extends CamelTestSupport {
+    private static final String ACCESS_KEY = "accessKey";
+    private static final String ACCOUNT_NAME = "accountName";
+    private static final String AZURITE_IMAGE_NAME = "mcr.microsoft.com/azure-storage/azurite:3.9.0";
+    private static final int AZURITE_EXPOSED_PORT = 10000;
+    private static String accountName;
+    private static String accessKey;
+    private static String endpoint;
+
+    protected BlobServiceClient serviceClient;
+    protected BlobConfiguration configuration;
+    protected String containerName;
+
+    static {
+        // Start testcontainers as a singleton if needed
+        initEndpoint();
+    }
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+        context.getRegistry().bind("serviceClient", serviceClient);
+        return context;
+    }
+
+    static void initEndpoint() {
+        accountName = System.getProperty(ACCOUNT_NAME);
+        accessKey = System.getProperty(ACCESS_KEY);
+        endpoint = String.format("https://%s.blob.core.windows.net", accountName);
+
+        // If everything is set, do not start Azurite
+        if (StringUtils.isNotEmpty(accountName) && StringUtils.isNotEmpty(accessKey)) {
+            return;
+        }
+
+        if ((StringUtils.isEmpty(accountName) && StringUtils.isNotEmpty(accessKey)) ||
+                (StringUtils.isNotEmpty(accountName) && StringUtils.isEmpty(accessKey))) {
+            throw new IllegalArgumentException(
+                    "Make sure to supply both azure accessKey and accountName," +
+                                               " e.g:  mvn verify -DaccountName=myacc -DaccessKey=mykey");
+        }
+
+        final GenericContainer<?> azurite = new GenericContainer<>(AZURITE_IMAGE_NAME)
+                .withExposedPorts(AZURITE_EXPOSED_PORT);
+        azurite.start();
+        Properties azuriteProperties = BlobTestUtils.getAzuriteProperties();
+        accountName = azuriteProperties.getProperty(ACCOUNT_NAME);
+        accessKey = azuriteProperties.getProperty(ACCESS_KEY);
+        endpoint = String.format("http://%s:%d/%s", azurite.getContainerIpAddress(),
+                azurite.getMappedPort(AZURITE_EXPOSED_PORT), accountName);
+    }
+
+    @BeforeAll
+    void initProperties() {
+        containerName = RandomStringUtils.randomAlphabetic(5).toLowerCase();
+
+        configuration = new BlobConfiguration();
+        configuration.setCredentials(new StorageSharedKeyCredential(accountName, accessKey));
+        configuration.setContainerName(containerName);
+
+        serviceClient = new BlobServiceClientBuilder()
+                .credential(configuration.getCredentials())
+                .endpoint(endpoint)
+                .buildClient();
+    }
+}
diff --git a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobConsumerIT.java b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobConsumerITTest.java
similarity index 82%
rename from components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobConsumerIT.java
rename to components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobConsumerITTest.java
index bf1f533..c7a73e1 100644
--- a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobConsumerIT.java
+++ b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobConsumerITTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.azure.storage.blob;
+package org.apache.camel.component.azure.storage.blob.integration;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -22,29 +22,24 @@ import java.io.IOException;
 import java.io.InputStreamReader;
 import java.nio.charset.Charset;
 import java.nio.file.Path;
-import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
 
 import com.azure.storage.blob.BlobContainerClient;
-import com.azure.storage.blob.BlobServiceClient;
 import com.azure.storage.blob.specialized.BlobInputStream;
-import com.azure.storage.common.StorageSharedKeyCredential;
-import org.apache.camel.CamelContext;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.azure.storage.blob.client.BlobClientFactory;
+import org.apache.camel.component.azure.storage.blob.BlobConstants;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
 import org.junit.jupiter.api.io.TempDir;
 
 import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
@@ -52,14 +47,12 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-class BlobConsumerIT extends CamelTestSupport {
+class BlobConsumerITTest extends BaseIT {
 
     @TempDir
     static Path testDir;
     @EndpointInject("direct:start")
     private ProducerTemplate templateStart;
-    private String containerName;
     private String batchContainerName;
     private String blobName;
     private String blobName2;
@@ -69,17 +62,11 @@ class BlobConsumerIT extends CamelTestSupport {
     private final String regex = ".*\\.pdf";
 
     @BeforeAll
-    public void prepare() throws Exception {
-        containerName = RandomStringUtils.randomAlphabetic(5).toLowerCase();
+    public void setup() {
         batchContainerName = RandomStringUtils.randomAlphabetic(5).toLowerCase();
         blobName = RandomStringUtils.randomAlphabetic(5);
         blobName2 = RandomStringUtils.randomAlphabetic(5);
 
-        BlobConfiguration configuration = new BlobConfiguration();
-        configuration.setCredentials(storageSharedKeyCredential());
-        configuration.setBlobName(blobName);
-
-        final BlobServiceClient serviceClient = BlobClientFactory.createBlobServiceClient(configuration);
         containerClient = serviceClient.getBlobContainerClient(containerName);
         batchContainerClient = serviceClient.getBlobContainerClient(batchContainerName);
 
@@ -88,7 +75,6 @@ class BlobConsumerIT extends CamelTestSupport {
         // create test container
         containerClient.create();
         batchContainerClient.create();
-
     }
 
     @Test
@@ -175,10 +161,11 @@ class BlobConsumerIT extends CamelTestSupport {
     }
 
     @Test
-    void testRegexPolling() throws InterruptedException, IOException {
+    @Disabled("This test should be fixed to use mock:resultRegex endpoint instead of mock:resultBatch")
+    void testRegexPolling() throws InterruptedException {
         Pattern pattern = Pattern.compile(regex);
 
-        //create pdf blobs
+        // create pdf blobs
         for (int i = 0; i < 10; i++) {
             templateStart.send("direct:createBlob", ExchangePattern.InOnly, exchange -> {
                 exchange.getIn().setBody("Block Batch Blob Test");
@@ -195,7 +182,7 @@ class BlobConsumerIT extends CamelTestSupport {
             });
         }
 
-        //create docx blobs
+        // create docx blobs
         for (int i = 0; i < 20; i++) {
             templateStart.send("direct:createBlob", ExchangePattern.InOnly, exchange -> {
                 exchange.getIn().setBody("Block Batch Blob Test");
@@ -217,8 +204,7 @@ class BlobConsumerIT extends CamelTestSupport {
     }
 
     private String generateRandomBlobName(String prefix, String extension) {
-        return prefix
-               + randomAlphabetic(5).toLowerCase() + "." + extension;
+        return prefix + randomAlphabetic(5).toLowerCase() + "." + extension;
     }
 
     @AfterAll
@@ -229,40 +215,31 @@ class BlobConsumerIT extends CamelTestSupport {
     }
 
     @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        context.getRegistry().bind("creds", storageSharedKeyCredential());
-        return context;
-    }
-
-    @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
                 from("direct:createBlob")
-                        .to("azure-storage-blob://cameldev?credentials=#creds&operation=uploadBlockBlob");
+                        .to("azure-storage-blob://cameldev?blobServiceClient=#serviceClient&operation=uploadBlockBlob");
 
-                from("azure-storage-blob://cameldev/" + containerName + "?blobName=" + blobName + "&credentials=#creds&fileDir="
+                from("azure-storage-blob://cameldev/" + containerName + "?blobName=" + blobName
+                     + "&blobServiceClient=#serviceClient&fileDir="
                      + testDir.toString()).to("mock:result");
 
-                from("azure-storage-blob://cameldev/" + containerName + "?blobName=" + blobName2 + "&credentials=#creds")
-                        .to("mock:resultOutputStream");
+                from("azure-storage-blob://cameldev/" + containerName + "?blobName=" + blobName2
+                     + "&blobServiceClient=#serviceClient")
+                             .to("mock:resultOutputStream");
 
-                from("azure-storage-blob://cameldev/" + batchContainerName + "?credentials=#creds")
+                from("azure-storage-blob://cameldev/" + batchContainerName + "?blobServiceClient=#serviceClient")
                         .to("mock:resultBatch");
 
-                from("azure-storage-blob://cameldev/" + batchContainerName + "?credentials=#creds&fileDir="
+                from("azure-storage-blob://cameldev/" + batchContainerName + "?blobServiceClient=#serviceClient&fileDir="
                      + testDir.toString()).to("mock:resultBatchFile");
 
-                from("azure-storage-blob://cameldev/" + batchContainerName + "?credentials=#creds&prefix=aaaa&regex=" + regex)
-                        .to("mock:resultRegex");
+                from("azure-storage-blob://cameldev/" + batchContainerName
+                     + "?blobServiceClient=#serviceClient&prefix=aaaa&regex=" + regex)
+                             .to("mock:resultRegex");
             }
         };
     }
-
-    private StorageSharedKeyCredential storageSharedKeyCredential() throws Exception {
-        final Properties properties = BlobTestUtils.loadAzureAccessFromJvmEnv();
-        return new StorageSharedKeyCredential(properties.getProperty("account_name"), properties.getProperty("access_key"));
-    }
 }
diff --git a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/operations/BlobContainerOperationsIT.java b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobContainerOperationsITTest.java
similarity index 79%
rename from components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/operations/BlobContainerOperationsIT.java
rename to components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobContainerOperationsITTest.java
index bdd496c..2e45bde 100644
--- a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/operations/BlobContainerOperationsIT.java
+++ b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobContainerOperationsITTest.java
@@ -14,47 +14,35 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.azure.storage.blob.operations;
+package org.apache.camel.component.azure.storage.blob.integration;
 
 import java.util.Collections;
-import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
 import com.azure.storage.blob.models.BlobStorageException;
 import com.azure.storage.blob.models.PublicAccessType;
 import org.apache.camel.Exchange;
-import org.apache.camel.component.azure.storage.blob.BlobConfiguration;
 import org.apache.camel.component.azure.storage.blob.BlobConstants;
-import org.apache.camel.component.azure.storage.blob.BlobTestUtils;
-import org.apache.camel.component.azure.storage.blob.client.BlobClientFactory;
 import org.apache.camel.component.azure.storage.blob.client.BlobContainerClientWrapper;
 import org.apache.camel.component.azure.storage.blob.client.BlobServiceClientWrapper;
+import org.apache.camel.component.azure.storage.blob.operations.BlobContainerOperations;
+import org.apache.camel.component.azure.storage.blob.operations.BlobOperationResponse;
 import org.apache.camel.support.DefaultExchange;
-import org.apache.camel.test.junit5.CamelTestSupport;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-class BlobContainerOperationsIT extends CamelTestSupport {
+class BlobContainerOperationsITTest extends BaseIT {
 
-    private BlobConfiguration configuration;
     private BlobServiceClientWrapper blobServiceClientWrapper;
 
     @BeforeAll
-    public void setup() throws Exception {
-        final Properties properties = BlobTestUtils.loadAzureAccessFromJvmEnv();
-
-        configuration = new BlobConfiguration();
-        configuration.setAccountName(properties.getProperty("account_name"));
-        configuration.setAccessKey(properties.getProperty("access_key"));
-
-        blobServiceClientWrapper = new BlobServiceClientWrapper(BlobClientFactory.createBlobServiceClient(configuration));
+    public void setup() {
+        blobServiceClientWrapper = new BlobServiceClientWrapper(serviceClient);
     }
 
     @Test
diff --git a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/operations/BlobOperationsIT.java b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobOperationsITTest.java
similarity index 94%
rename from components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/operations/BlobOperationsIT.java
rename to components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobOperationsITTest.java
index 40913c3..ea5a5a1 100644
--- a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/operations/BlobOperationsIT.java
+++ b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobOperationsITTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.azure.storage.blob.operations;
+package org.apache.camel.component.azure.storage.blob.integration;
 
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
@@ -29,7 +29,6 @@ import java.nio.file.Path;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
-import java.util.Properties;
 import java.util.Random;
 
 import com.azure.storage.blob.models.PageList;
@@ -37,51 +36,37 @@ import com.azure.storage.blob.models.PageRange;
 import com.azure.storage.blob.specialized.BlobInputStream;
 import org.apache.camel.Exchange;
 import org.apache.camel.component.azure.storage.blob.BlobBlock;
-import org.apache.camel.component.azure.storage.blob.BlobConfiguration;
 import org.apache.camel.component.azure.storage.blob.BlobConstants;
-import org.apache.camel.component.azure.storage.blob.BlobTestUtils;
 import org.apache.camel.component.azure.storage.blob.BlobUtils;
-import org.apache.camel.component.azure.storage.blob.client.BlobClientFactory;
 import org.apache.camel.component.azure.storage.blob.client.BlobClientWrapper;
 import org.apache.camel.component.azure.storage.blob.client.BlobContainerClientWrapper;
 import org.apache.camel.component.azure.storage.blob.client.BlobServiceClientWrapper;
+import org.apache.camel.component.azure.storage.blob.operations.BlobOperationResponse;
+import org.apache.camel.component.azure.storage.blob.operations.BlobOperations;
 import org.apache.camel.support.DefaultExchange;
-import org.apache.camel.test.junit5.CamelTestSupport;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
 import org.junit.jupiter.api.io.TempDir;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-class BlobOperationsIT extends CamelTestSupport {
+class BlobOperationsITTest extends BaseIT {
 
-    private BlobConfiguration configuration;
     private BlobContainerClientWrapper blobContainerClientWrapper;
 
     private String randomBlobName;
-    private String randomContainerName;
 
     @BeforeAll
     public void setup() throws Exception {
-        final Properties properties = BlobTestUtils.loadAzureAccessFromJvmEnv();
-
-        randomContainerName = RandomStringUtils.randomAlphabetic(5).toLowerCase();
         randomBlobName = RandomStringUtils.randomAlphabetic(10);
 
-        configuration = new BlobConfiguration();
-        configuration.setAccountName(properties.getProperty("account_name"));
-        configuration.setAccessKey(properties.getProperty("access_key"));
-        configuration.setContainerName(randomContainerName);
-
-        blobContainerClientWrapper = new BlobServiceClientWrapper(BlobClientFactory.createBlobServiceClient(configuration))
+        blobContainerClientWrapper = new BlobServiceClientWrapper(serviceClient)
                 .getBlobContainerClientWrapper(configuration.getContainerName());
 
         // create test container
diff --git a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobProducerIT.java b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobProducerITTest.java
similarity index 82%
rename from components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobProducerIT.java
rename to components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobProducerITTest.java
index 53737d4..630c1e3 100644
--- a/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/BlobProducerIT.java
+++ b/components/camel-azure-storage-blob/src/test/java/org/apache/camel/component/azure/storage/blob/integration/BlobProducerITTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.azure.storage.blob;
+package org.apache.camel.component.azure.storage.blob.integration;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -22,32 +22,26 @@ import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Properties;
 import java.util.Random;
 
 import com.azure.storage.blob.BlobContainerClient;
-import com.azure.storage.blob.BlobServiceClient;
 import com.azure.storage.blob.models.PageRange;
-import com.azure.storage.common.StorageSharedKeyCredential;
-import org.apache.camel.CamelContext;
 import org.apache.camel.EndpointInject;
 import org.apache.camel.ExchangePattern;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.azure.storage.blob.client.BlobClientFactory;
+import org.apache.camel.component.azure.storage.blob.BlobBlock;
+import org.apache.camel.component.azure.storage.blob.BlobConstants;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInstance;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-class BlobProducerIT extends CamelTestSupport {
+class BlobProducerITTest extends BaseIT {
 
     @EndpointInject
     private ProducerTemplate template;
@@ -55,23 +49,12 @@ class BlobProducerIT extends CamelTestSupport {
     @EndpointInject("mock:result")
     private MockEndpoint result;
     private String resultName = "mock:result";
-
-    private String containerName;
-
     private BlobContainerClient containerClient;
 
     @BeforeAll
-    public void prepare() throws Exception {
-        containerName = RandomStringUtils.randomAlphabetic(5).toLowerCase();
-
-        BlobConfiguration configuration = new BlobConfiguration();
-        configuration.setCredentials(storageSharedKeyCredential());
-        configuration.setContainerName(containerName);
-
-        final BlobServiceClient serviceClient = BlobClientFactory.createBlobServiceClient(configuration);
-        containerClient = serviceClient.getBlobContainerClient(containerName);
-
+    public void prepare() {
         // create test container
+        containerClient = serviceClient.getBlobContainerClient(containerName);
         containerClient.create();
     }
 
@@ -198,13 +181,6 @@ class BlobProducerIT extends CamelTestSupport {
     }
 
     @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        context.getRegistry().bind("creds", storageSharedKeyCredential());
-        return context;
-    }
-
-    @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             @Override
@@ -236,12 +212,8 @@ class BlobProducerIT extends CamelTestSupport {
         };
     }
 
-    private StorageSharedKeyCredential storageSharedKeyCredential() throws Exception {
-        final Properties properties = BlobTestUtils.loadAzureAccessFromJvmEnv();
-        return new StorageSharedKeyCredential(properties.getProperty("account_name"), properties.getProperty("access_key"));
-    }
-
     private String componentUri(final String operation) {
-        return String.format("azure-storage-blob://cameldev/%s?credentials=#creds&operation=%s", containerName, operation);
+        return String.format("azure-storage-blob://cameldev/%s?blobServiceClient=#serviceClient&operation=%s", containerName,
+                operation);
     }
 }
diff --git a/components/camel-azure-storage-blob/src/test/resources/azurite.properties b/components/camel-azure-storage-blob/src/test/resources/azurite.properties
new file mode 100644
index 0000000..ba73f23
--- /dev/null
+++ b/components/camel-azure-storage-blob/src/test/resources/azurite.properties
@@ -0,0 +1,19 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+# Default Azurite properties
+accountName=devstoreaccount1
+accessKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/pages/azure-storage-blob-component.adoc b/docs/components/modules/ROOT/pages/azure-storage-blob-component.adoc
index b9ce1f3..d89160a 100644
--- a/docs/components/modules/ROOT/pages/azure-storage-blob-component.adoc
+++ b/docs/components/modules/ROOT/pages/azure-storage-blob-component.adoc
@@ -687,8 +687,10 @@ from("direct:start")
 
 
 === Development Notes (Important)
-When developing on this component, you will need to obtain your Azure accessKey in order to run the integration tests. In addition to the mocked unit tests
-you *will need to run the integration tests with every change you make or even client upgrade as the Azure client can break things even on minor versions upgrade.*
+All integration tests use [Testcontainers](https://www.testcontainers.org/) and run by default.
+Obtaining of Azure accessKey and accountName is needed to be able to run all integration tests using Azure services.
+In addition to the mocked unit tests you *will need to run the integration tests
+with every change you make or even client upgrade as the Azure client can break things even on minor versions upgrade.*
 To run the integration tests, on this component directory, run the following maven command:
 ----
 mvn verify -PfullTests -DaccountName=myacc -DaccessKey=mykey