Skip to content

Commit 68712d4

Browse files
refs #90: Added more mutation coverage for wrappers
1 parent a6bb9d1 commit 68712d4

File tree

7 files changed

+174
-12
lines changed

7 files changed

+174
-12
lines changed

java-dynamic-sqs-listener-core/src/main/java/com/jashmore/sqs/retriever/batching/StaticBatchingMessageRetrieverProperties.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.jashmore.sqs.retriever.batching;
22

33
import lombok.Builder;
4+
import lombok.Value;
45

56
import javax.annotation.Nullable;
67
import javax.validation.constraints.Positive;
@@ -9,6 +10,7 @@
910
/**
1011
* Static implementation of the properties that will never change during the processing of the messages.
1112
*/
13+
@Value
1214
@Builder(toBuilder = true)
1315
public class StaticBatchingMessageRetrieverProperties implements BatchingMessageRetrieverProperties {
1416
private final int numberOfThreadsWaitingTrigger;

java-dynamic-sqs-listener-spring/java-dynamic-sqs-listener-spring-starter/src/main/java/com/jashmore/sqs/spring/container/basic/QueueListenerWrapper.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.jashmore.sqs.spring.container.basic;
22

3+
import com.google.common.annotations.VisibleForTesting;
4+
35
import com.jashmore.sqs.QueueProperties;
46
import com.jashmore.sqs.argument.ArgumentResolverService;
57
import com.jashmore.sqs.broker.concurrent.ConcurrentMessageBroker;
@@ -83,14 +85,17 @@ protected IdentifiableMessageListenerContainer wrapMethodContainingAnnotation(fi
8385
}
8486

8587
private MessageRetriever buildMessageRetriever(final QueueListener annotation, final QueueProperties queueProperties, final int concurrencyLevel) {
86-
final BatchingMessageRetrieverProperties batchingMessageRetrieverProperties = StaticBatchingMessageRetrieverProperties
87-
.builder()
88+
return new BatchingMessageRetriever(
89+
queueProperties, sqsAsyncClient, batchingMessageRetrieverProperties(annotation, concurrencyLevel));
90+
}
91+
92+
@VisibleForTesting
93+
BatchingMessageRetrieverProperties batchingMessageRetrieverProperties(final QueueListener annotation, final int concurrencyLevel) {
94+
return StaticBatchingMessageRetrieverProperties.builder()
8895
.visibilityTimeoutInSeconds(getMessageVisibilityTimeoutInSeconds(annotation))
8996
.messageRetrievalPollingPeriodInMs(getMaxPeriodBetweenBatchesInMs(annotation))
9097
.numberOfThreadsWaitingTrigger(concurrencyLevel)
9198
.build();
92-
return new BatchingMessageRetriever(
93-
queueProperties, sqsAsyncClient, batchingMessageRetrieverProperties);
9499
}
95100

96101
private int getConcurrencyLevel(final QueueListener annotation) {

java-dynamic-sqs-listener-spring/java-dynamic-sqs-listener-spring-starter/src/main/java/com/jashmore/sqs/spring/container/batching/BatchingQueueListenerWrapper.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.jashmore.sqs.spring.container.batching;
22

3+
import com.google.common.annotations.VisibleForTesting;
4+
35
import com.jashmore.sqs.QueueProperties;
46
import com.jashmore.sqs.argument.ArgumentResolverService;
57
import com.jashmore.sqs.broker.concurrent.ConcurrentMessageBroker;
@@ -28,6 +30,7 @@
2830
import software.amazon.awssdk.services.sqs.SqsAsyncClient;
2931

3032
import java.lang.reflect.Method;
33+
import javax.annotation.Nonnull;
3134

3235
/**
3336
* {@link QueueWrapper} that will wrap methods annotated with {@link QueueListener @QueueListener} with some predefined
@@ -88,14 +91,17 @@ protected IdentifiableMessageListenerContainer wrapMethodContainingAnnotation(fi
8891
}
8992

9093
private MessageRetriever buildMessageRetriever(final BatchingQueueListener annotation, final QueueProperties queueProperties, final int concurrencyLevel) {
91-
final BatchingMessageRetrieverProperties batchingMessageRetrieverProperties = StaticBatchingMessageRetrieverProperties
94+
return new BatchingMessageRetriever(queueProperties, sqsAsyncClient, batchingMessageRetrieverProperties(annotation, concurrencyLevel));
95+
}
96+
97+
@VisibleForTesting
98+
BatchingMessageRetrieverProperties batchingMessageRetrieverProperties(final BatchingQueueListener annotation, final int concurrencyLevel) {
99+
return StaticBatchingMessageRetrieverProperties
92100
.builder()
93101
.visibilityTimeoutInSeconds(getMessageVisibilityTimeoutInSeconds(annotation))
94102
.messageRetrievalPollingPeriodInMs(getMaxPeriodBetweenBatchesInMs(annotation))
95103
.numberOfThreadsWaitingTrigger(concurrencyLevel)
96104
.build();
97-
return new BatchingMessageRetriever(
98-
queueProperties, sqsAsyncClient, batchingMessageRetrieverProperties);
99105
}
100106

101107
private MessageResolver buildMessageResolver(final QueueProperties queueProperties,

java-dynamic-sqs-listener-spring/java-dynamic-sqs-listener-spring-starter/src/main/java/com/jashmore/sqs/spring/container/prefetch/PrefetchingQueueListenerWrapper.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import static com.jashmore.sqs.aws.AwsConstants.MAX_SQS_RECEIVE_WAIT_TIME_IN_SECONDS;
44

5+
import com.google.common.annotations.VisibleForTesting;
6+
57
import com.jashmore.sqs.QueueProperties;
68
import com.jashmore.sqs.argument.ArgumentResolverService;
79
import com.jashmore.sqs.broker.concurrent.ConcurrentMessageBroker;
@@ -112,15 +114,17 @@ private int getDesiredMinPrefetchedMessages(final PrefetchingQueueListener annot
112114
return Integer.parseInt(environment.resolvePlaceholders(annotation.desiredMinPrefetchedMessagesString()));
113115
}
114116

115-
private MessageRetriever buildMessageRetriever(final PrefetchingQueueListener annotation,
116-
final QueueProperties queueProperties) {
117-
final PrefetchingMessageRetrieverProperties prefetchingProperties = StaticPrefetchingMessageRetrieverProperties
118-
.builder()
117+
@VisibleForTesting
118+
PrefetchingMessageRetrieverProperties buildMessageRetrieverProperties(final PrefetchingQueueListener annotation) {
119+
return StaticPrefetchingMessageRetrieverProperties.builder()
119120
.desiredMinPrefetchedMessages(getDesiredMinPrefetchedMessages(annotation))
120121
.maxPrefetchedMessages(getMaxPrefetchedMessages(annotation))
121122
.visibilityTimeoutForMessagesInSeconds(getMessageVisibilityTimeoutInSeconds(annotation))
122123
.maxWaitTimeInSecondsToObtainMessagesFromServer(MAX_SQS_RECEIVE_WAIT_TIME_IN_SECONDS)
123124
.build();
124-
return new PrefetchingMessageRetriever(sqsAsyncClient, queueProperties, prefetchingProperties);
125+
}
126+
127+
private MessageRetriever buildMessageRetriever(final PrefetchingQueueListener annotation, final QueueProperties queueProperties) {
128+
return new PrefetchingMessageRetriever(sqsAsyncClient, queueProperties, buildMessageRetrieverProperties(annotation));
125129
}
126130
}

java-dynamic-sqs-listener-spring/java-dynamic-sqs-listener-spring-starter/src/test/java/com/jashmore/sqs/spring/container/basic/QueueListenerWrapperTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import com.jashmore.sqs.argument.ArgumentResolverService;
99
import com.jashmore.sqs.container.SimpleMessageListenerContainer;
10+
import com.jashmore.sqs.retriever.batching.BatchingMessageRetrieverProperties;
11+
import com.jashmore.sqs.retriever.batching.StaticBatchingMessageRetrieverProperties;
1012
import com.jashmore.sqs.spring.IdentifiableMessageListenerContainer;
1113
import com.jashmore.sqs.spring.queue.QueueResolverService;
1214
import org.junit.Before;
@@ -160,6 +162,46 @@ public void validStringFieldsWillCorrectlyBuildMessageListener() throws Exceptio
160162
assertThat(messageListenerContainer).isNotNull();
161163
}
162164

165+
@Test
166+
public void batchingMessageRetrieverPropertiesBuiltFromAnnotationValues() throws Exception {
167+
// arrange
168+
final Method method = QueueListenerWrapperTest.class.getMethod("myMethodWithParameters");
169+
final QueueListener annotation = method.getAnnotation(QueueListener.class);
170+
171+
// act
172+
final BatchingMessageRetrieverProperties properties
173+
= queueListenerWrapper.batchingMessageRetrieverProperties(annotation, 2);
174+
175+
// assert
176+
assertThat(properties).isEqualTo(StaticBatchingMessageRetrieverProperties.builder()
177+
.visibilityTimeoutInSeconds(300)
178+
.messageRetrievalPollingPeriodInMs(60L)
179+
.numberOfThreadsWaitingTrigger(2)
180+
.build()
181+
);
182+
}
183+
184+
@Test
185+
public void batchingMessageRetrieverPropertiesBuiltFromSpringValues() throws Exception {
186+
// arrange
187+
final Method method = QueueListenerWrapperTest.class.getMethod("methodWithFieldsUsingEnvironmentProperties");
188+
final QueueListener annotation = method.getAnnotation(QueueListener.class);
189+
when(environment.resolvePlaceholders("${prop.period}")).thenReturn("30");
190+
when(environment.resolvePlaceholders("${prop.visibility}")).thenReturn("40");
191+
192+
// act
193+
final BatchingMessageRetrieverProperties properties
194+
= queueListenerWrapper.batchingMessageRetrieverProperties(annotation, 2);
195+
196+
// assert
197+
assertThat(properties).isEqualTo(StaticBatchingMessageRetrieverProperties.builder()
198+
.visibilityTimeoutInSeconds(40)
199+
.messageRetrievalPollingPeriodInMs(30L)
200+
.numberOfThreadsWaitingTrigger(2)
201+
.build()
202+
);
203+
}
204+
163205
@QueueListener("test")
164206
public void myMethod() {
165207

@@ -175,4 +217,9 @@ public void myMethodWithIdentifier() {
175217
public void methodWithFieldsUsingEnvironmentProperties() {
176218

177219
}
220+
221+
@QueueListener(value = "test", concurrencyLevel = 6, messageVisibilityTimeoutInSeconds = 300, maxPeriodBetweenBatchesInMs = 60)
222+
public void myMethodWithParameters() {
223+
224+
}
178225
}

java-dynamic-sqs-listener-spring/java-dynamic-sqs-listener-spring-starter/src/test/java/com/jashmore/sqs/spring/container/batching/BatchingQueueListenerWrapperTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import com.jashmore.sqs.argument.ArgumentResolverService;
99
import com.jashmore.sqs.container.SimpleMessageListenerContainer;
10+
import com.jashmore.sqs.retriever.batching.BatchingMessageRetrieverProperties;
11+
import com.jashmore.sqs.retriever.batching.StaticBatchingMessageRetrieverProperties;
1012
import com.jashmore.sqs.spring.IdentifiableMessageListenerContainer;
1113
import com.jashmore.sqs.spring.queue.QueueResolverService;
1214
import org.junit.Before;
@@ -156,6 +158,44 @@ public void validStringFieldsWillCorrectlyBuildMessageListener() throws Exceptio
156158
assertThat(messageListenerContainer).isNotNull();
157159
}
158160

161+
@Test
162+
public void batchingMessageRetrieversBuiltFromAnnotationProperties() throws Exception {
163+
// arrange
164+
final Method method = BatchingQueueListenerWrapperTest.class.getMethod("methodWithFields");
165+
final BatchingQueueListener annotation = method.getAnnotation(BatchingQueueListener.class);
166+
167+
// act
168+
final BatchingMessageRetrieverProperties properties = batchingQueueListenerWrapper.batchingMessageRetrieverProperties(annotation, 2);
169+
170+
// assert
171+
assertThat(properties).isEqualTo(StaticBatchingMessageRetrieverProperties.builder()
172+
.visibilityTimeoutInSeconds(300)
173+
.messageRetrievalPollingPeriodInMs(40L)
174+
.numberOfThreadsWaitingTrigger(2)
175+
.build()
176+
);
177+
}
178+
179+
@Test
180+
public void batchingMessageRetrieversBuiltFromAnnotationStringProperties() throws Exception {
181+
// arrange
182+
final Method method = BatchingQueueListenerWrapperTest.class.getMethod("methodWithFieldsUsingEnvironmentProperties");
183+
final BatchingQueueListener annotation = method.getAnnotation(BatchingQueueListener.class);
184+
when(environment.resolvePlaceholders("${prop.period}")).thenReturn("30");
185+
when(environment.resolvePlaceholders("${prop.visibility}")).thenReturn("40");
186+
187+
// act
188+
final BatchingMessageRetrieverProperties properties = batchingQueueListenerWrapper.batchingMessageRetrieverProperties(annotation, 2);
189+
190+
// assert
191+
assertThat(properties).isEqualTo(StaticBatchingMessageRetrieverProperties.builder()
192+
.visibilityTimeoutInSeconds(40)
193+
.messageRetrievalPollingPeriodInMs(30L)
194+
.numberOfThreadsWaitingTrigger(2)
195+
.build()
196+
);
197+
}
198+
159199
@BatchingQueueListener("test")
160200
public void myMethod() {
161201

@@ -171,4 +211,9 @@ public void myMethodWithIdentifier() {
171211
public void methodWithFieldsUsingEnvironmentProperties() {
172212

173213
}
214+
215+
@BatchingQueueListener(value = "test2", messageVisibilityTimeoutInSeconds = 300, maxPeriodBetweenBatchesInMs = 40)
216+
public void methodWithFields() {
217+
218+
}
174219
}

java-dynamic-sqs-listener-spring/java-dynamic-sqs-listener-spring-starter/src/test/java/com/jashmore/sqs/spring/container/prefetch/PrefetchingQueueListenerWrapperTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.jashmore.sqs.spring.container.prefetch;
22

3+
import static com.jashmore.sqs.aws.AwsConstants.MAX_SQS_RECEIVE_WAIT_TIME_IN_SECONDS;
34
import static org.assertj.core.api.Assertions.assertThat;
45
import static org.mockito.ArgumentMatchers.anyString;
56
import static org.mockito.Mockito.verify;
67
import static org.mockito.Mockito.when;
78

89
import com.jashmore.sqs.argument.ArgumentResolverService;
910
import com.jashmore.sqs.container.SimpleMessageListenerContainer;
11+
import com.jashmore.sqs.retriever.prefetch.PrefetchingMessageRetrieverProperties;
12+
import com.jashmore.sqs.retriever.prefetch.StaticPrefetchingMessageRetrieverProperties;
1013
import com.jashmore.sqs.spring.IdentifiableMessageListenerContainer;
1114
import com.jashmore.sqs.spring.queue.QueueResolverService;
1215
import org.junit.Before;
@@ -174,6 +177,49 @@ public void validStringFieldsWillCorrectlyBuildMessageListener() throws Exceptio
174177
assertThat(messageListenerContainer).isNotNull();
175178
}
176179

180+
@Test
181+
public void prefetchingQueueListenerCanBeBuiltFromStringProperties() throws Exception {
182+
// arrange
183+
when(environment.resolvePlaceholders(anyString())).thenReturn("1");
184+
final Method method = PrefetchingQueueListenerWrapperTest.class.getMethod("methodWithFieldsUsingEnvironmentProperties");
185+
when(environment.resolvePlaceholders("${prop.maxPrefetched}")).thenReturn("30");
186+
when(environment.resolvePlaceholders("${prop.desiredMinPrefetchedMessages}")).thenReturn("40");
187+
when(environment.resolvePlaceholders("${prop.visibility}")).thenReturn("40");
188+
final PrefetchingQueueListener annotation = method.getAnnotation(PrefetchingQueueListener.class);
189+
190+
// act
191+
final PrefetchingMessageRetrieverProperties properties = prefetchingQueueListenerWrapper.buildMessageRetrieverProperties(annotation);
192+
193+
// assert
194+
assertThat(properties).isEqualTo(StaticPrefetchingMessageRetrieverProperties.builder()
195+
.maxPrefetchedMessages(30)
196+
.desiredMinPrefetchedMessages(40)
197+
.visibilityTimeoutForMessagesInSeconds(40)
198+
.maxWaitTimeInSecondsToObtainMessagesFromServer(MAX_SQS_RECEIVE_WAIT_TIME_IN_SECONDS)
199+
.build()
200+
);
201+
}
202+
203+
@Test
204+
public void prefetchingQueueListenerCanBeBuiltFromProperties() throws Exception {
205+
// arrange
206+
when(environment.resolvePlaceholders(anyString())).thenReturn("1");
207+
final Method method = PrefetchingQueueListenerWrapperTest.class.getMethod("methodWithFieldsUsingProperties");
208+
final PrefetchingQueueListener annotation = method.getAnnotation(PrefetchingQueueListener.class);
209+
210+
// act
211+
final PrefetchingMessageRetrieverProperties properties = prefetchingQueueListenerWrapper.buildMessageRetrieverProperties(annotation);
212+
213+
// assert
214+
assertThat(properties).isEqualTo(StaticPrefetchingMessageRetrieverProperties.builder()
215+
.maxPrefetchedMessages(20)
216+
.desiredMinPrefetchedMessages(5)
217+
.visibilityTimeoutForMessagesInSeconds(300)
218+
.maxWaitTimeInSecondsToObtainMessagesFromServer(MAX_SQS_RECEIVE_WAIT_TIME_IN_SECONDS)
219+
.build()
220+
);
221+
}
222+
177223
@PrefetchingQueueListener("test")
178224
public void myMethod() {
179225

@@ -191,4 +237,11 @@ public void myMethodWithIdentifier() {
191237
public void methodWithFieldsUsingEnvironmentProperties() {
192238

193239
}
240+
241+
@PrefetchingQueueListener(value = "test2", concurrencyLevel = 2, messageVisibilityTimeoutInSeconds = 300,
242+
maxPrefetchedMessages = 20, desiredMinPrefetchedMessages = 5
243+
)
244+
public void methodWithFieldsUsingProperties() {
245+
246+
}
194247
}

0 commit comments

Comments
 (0)