From 24406665113ed28ab509b32ae1d73d0a772e9aa1 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Mon, 20 Oct 2025 18:58:24 +0300 Subject: [PATCH 1/2] BAEL-6761 - How to mock AmazonSQS in unit test --- aws-modules/aws-miscellaneous/pom.xml | 12 +++++ .../sqs/SqsAsyncMessagePublisher.java | 26 +++++++++ .../com/baeldung/sqs/SqsMessagePublisher.java | 24 +++++++++ .../sqs/SqsAsyncMessagePublisherTest.java | 53 +++++++++++++++++++ .../baeldung/sqs/SqsMessagePublisherTest.java | 52 ++++++++++++++++++ 5 files changed, 167 insertions(+) create mode 100644 aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsAsyncMessagePublisher.java create mode 100644 aws-modules/aws-miscellaneous/src/main/java/com/baeldung/sqs/SqsMessagePublisher.java create mode 100644 aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherTest.java create mode 100644 aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherTest.java 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/SqsAsyncMessagePublisherTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherTest.java new file mode 100644 index 000000000000..f85d4c8ebc38 --- /dev/null +++ b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherTest.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 SqsAsyncMessagePublisherTest { + + @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/SqsMessagePublisherTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherTest.java new file mode 100644 index 000000000000..eedb84f39bbf --- /dev/null +++ b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherTest.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 SqsMessagePublisherTest { + + @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 From 47995df08adf27e07a081dd89d2e20537b368c36 Mon Sep 17 00:00:00 2001 From: "alexandru.borza" Date: Mon, 20 Oct 2025 19:15:28 +0300 Subject: [PATCH 2/2] BAEL-6761 - rename files --- ...PublisherTest.java => SqsAsyncMessagePublisherUnitTest.java} | 2 +- ...ssagePublisherTest.java => SqsMessagePublisherUnitTest.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/{SqsAsyncMessagePublisherTest.java => SqsAsyncMessagePublisherUnitTest.java} (98%) rename aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/{SqsMessagePublisherTest.java => SqsMessagePublisherUnitTest.java} (98%) diff --git a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherUnitTest.java similarity index 98% rename from aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherTest.java rename to aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherUnitTest.java index f85d4c8ebc38..6ec70799d1c8 100644 --- a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherTest.java +++ b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsAsyncMessagePublisherUnitTest.java @@ -16,7 +16,7 @@ import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -class SqsAsyncMessagePublisherTest { +class SqsAsyncMessagePublisherUnitTest { @Mock private SqsAsyncClient sqsAsyncClient; diff --git a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherTest.java b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherUnitTest.java similarity index 98% rename from aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherTest.java rename to aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherUnitTest.java index eedb84f39bbf..c71d8638d463 100644 --- a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherTest.java +++ b/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/sqs/SqsMessagePublisherUnitTest.java @@ -16,7 +16,7 @@ import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -class SqsMessagePublisherTest { +class SqsMessagePublisherUnitTest { @Mock private SqsClient sqsClient;