diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml
index 50d6a9c47402..29aac272e756 100644
--- a/aws-modules/aws-miscellaneous/pom.xml
+++ b/aws-modules/aws-miscellaneous/pom.xml
@@ -30,6 +30,18 @@
gson
${gson.version}
+
+ org.mockito
+ mockito-core
+ 5.12.0
+ test
+
+
+ org.mockito
+ mockito-junit-jupiter
+ 5.12.0
+ test
+
diff --git a/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsAsyncMessagePublisher.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsAsyncMessagePublisher.java
new file mode 100644
index 000000000000..40b596b37759
--- /dev/null
+++ b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsAsyncMessagePublisher.java
@@ -0,0 +1,26 @@
+package com.baeldung.sqs;
+
+import software.amazon.awssdk.services.sqs.SqsAsyncClient;
+import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
+import software.amazon.awssdk.services.sqs.model.SendMessageResponse;
+
+import java.util.concurrent.CompletableFuture;
+
+public class SqsAsyncMessagePublisher {
+
+ private final SqsAsyncClient sqsAsyncClient;
+
+ public SqsAsyncMessagePublisher(SqsAsyncClient sqsAsyncClient) {
+ this.sqsAsyncClient = sqsAsyncClient;
+ }
+
+ public CompletableFuture publishMessage(String queueUrl, String messageBody) {
+ SendMessageRequest request = SendMessageRequest.builder()
+ .queueUrl(queueUrl)
+ .messageBody(messageBody)
+ .build();
+
+ return sqsAsyncClient.sendMessage(request)
+ .thenApply(SendMessageResponse::messageId);
+ }
+}
diff --git a/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsMessagePublisher.java b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsMessagePublisher.java
new file mode 100644
index 000000000000..25db63a1ca82
--- /dev/null
+++ b/aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsMessagePublisher.java
@@ -0,0 +1,24 @@
+package com.baeldung.sqs;
+
+import software.amazon.awssdk.services.sqs.SqsClient;
+import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
+import software.amazon.awssdk.services.sqs.model.SendMessageResponse;
+
+public class SqsMessagePublisher {
+
+ private final SqsClient sqsClient;
+
+ public SqsMessagePublisher(SqsClient sqsClient) {
+ this.sqsClient = sqsClient;
+ }
+
+ public String publishMessage(String queueUrl, String messageBody) {
+ SendMessageRequest request = SendMessageRequest.builder()
+ .queueUrl(queueUrl)
+ .messageBody(messageBody)
+ .build();
+
+ SendMessageResponse response = sqsClient.sendMessage(request);
+ return response.messageId();
+ }
+}
diff --git a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherUnitTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherUnitTest.java
new file mode 100644
index 000000000000..6ec70799d1c8
--- /dev/null
+++ b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.sqs;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import software.amazon.awssdk.services.sqs.SqsAsyncClient;
+import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
+import software.amazon.awssdk.services.sqs.model.SendMessageResponse;
+import java.util.concurrent.CompletableFuture;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class SqsAsyncMessagePublisherUnitTest {
+
+ @Mock
+ private SqsAsyncClient sqsAsyncClient;
+
+ @InjectMocks
+ private SqsAsyncMessagePublisher messagePublisher;
+
+ @Test
+ void whenPublishMessage_thenMessageIsSentAsynchronously() throws Exception {
+ // Arrange
+ String queueUrl = "https://sqs.us-east-1.amazonaws.com/123456789012/MyAsyncQueue";
+ String messageBody = "Hello, Async SQS!";
+ String expectedMessageId = "test-async-message-id-456";
+
+ SendMessageResponse mockResponse = SendMessageResponse.builder()
+ .messageId(expectedMessageId)
+ .build();
+ when(sqsAsyncClient.sendMessage(any(SendMessageRequest.class)))
+ .thenReturn(CompletableFuture.completedFuture(mockResponse));
+
+ // Act
+ String actualMessageId = messagePublisher.publishMessage(queueUrl, messageBody).get();
+
+ // Assert
+ assertThat(actualMessageId).isEqualTo(expectedMessageId);
+
+ ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(SendMessageRequest.class);
+ verify(sqsAsyncClient).sendMessage(requestCaptor.capture());
+
+ SendMessageRequest capturedRequest = requestCaptor.getValue();
+ assertThat(capturedRequest.queueUrl()).isEqualTo(queueUrl);
+ assertThat(capturedRequest.messageBody()).isEqualTo(messageBody);
+ }
+}
\ No newline at end of file
diff --git a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherUnitTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherUnitTest.java
new file mode 100644
index 000000000000..c71d8638d463
--- /dev/null
+++ b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.sqs;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import software.amazon.awssdk.services.sqs.SqsClient;
+import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
+import software.amazon.awssdk.services.sqs.model.SendMessageResponse;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class SqsMessagePublisherUnitTest {
+
+ @Mock
+ private SqsClient sqsClient;
+
+ @InjectMocks
+ private SqsMessagePublisher messagePublisher;
+
+ @Test
+ void whenPublishMessage_thenMessageIsSentWithCorrectParameters() {
+ // Arrange
+ String queueUrl = "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue";
+ String messageBody = "Hello, SQS!";
+ String expectedMessageId = "test-message-id-123";
+
+ SendMessageResponse mockResponse = SendMessageResponse.builder()
+ .messageId(expectedMessageId)
+ .build();
+ when(sqsClient.sendMessage(any(SendMessageRequest.class))).thenReturn(mockResponse);
+
+ // Act
+ String actualMessageId = messagePublisher.publishMessage(queueUrl, messageBody);
+
+ // Assert
+ assertThat(actualMessageId).isEqualTo(expectedMessageId);
+
+ ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(SendMessageRequest.class);
+ verify(sqsClient).sendMessage(requestCaptor.capture());
+
+ SendMessageRequest capturedRequest = requestCaptor.getValue();
+ assertThat(capturedRequest.queueUrl()).isEqualTo(queueUrl);
+ assertThat(capturedRequest.messageBody()).isEqualTo(messageBody);
+ }
+}
\ No newline at end of file