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