Skip to content

Commit 78fa297

Browse files
committed
GH-3873: Remove JMS test for private method
Fixes #3873 Testing for `private` method is considered as a bad practice and better to verify with the public method a private one is called * Remove `JmsOutboundGatewayParserTests.gatewayWithDestExpression()` in favor of `replyDestinationExpression` resolution in the `JmsOutboundGatewayTests.testConnectionBreakOnReplyMessageIdCorrelation()`.
1 parent 5f12729 commit 78fa297

File tree

3 files changed

+83
-160
lines changed

3 files changed

+83
-160
lines changed

spring-integration-jms/src/test/java/org/springframework/integration/jms/JmsOutboundGatewayTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.springframework.beans.factory.BeanFactory;
4747
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
4848
import org.springframework.integration.channel.QueueChannel;
49+
import org.springframework.integration.expression.ValueExpression;
4950
import org.springframework.integration.jms.JmsOutboundGateway.ReplyContainerProperties;
5051
import org.springframework.integration.test.util.TestUtils;
5152
import org.springframework.integration.util.ErrorHandlingTaskExecutor;
@@ -161,7 +162,7 @@ public void testConnectionBreakOnReplyMessageIdCorrelation() {
161162
String requestQ = "requests1";
162163
gateway.setRequestDestinationName(requestQ);
163164
String replyQ = "replies1";
164-
gateway.setReplyDestinationName(replyQ);
165+
gateway.setReplyDestinationExpression(new ValueExpression<>(replyQ));
165166
QueueChannel queueChannel = new QueueChannel();
166167
gateway.setOutputChannel(queueChannel);
167168
gateway.setBeanFactory(mock(BeanFactory.class));

spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundGatewayParserTests.java

Lines changed: 81 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -18,37 +18,25 @@
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
2020
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
21-
import static org.mockito.Mockito.mock;
22-
import static org.mockito.Mockito.when;
2321

24-
import java.lang.reflect.Method;
2522
import java.util.Properties;
2623

2724
import jakarta.jms.DeliveryMode;
28-
import jakarta.jms.Destination;
29-
import jakarta.jms.Queue;
30-
import jakarta.jms.Session;
3125

3226
import org.junit.jupiter.api.Test;
3327

34-
import org.springframework.beans.DirectFieldAccessor;
35-
import org.springframework.beans.NotReadablePropertyException;
3628
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
3729
import org.springframework.context.support.ClassPathXmlApplicationContext;
3830
import org.springframework.expression.Expression;
3931
import org.springframework.integration.core.MessagingTemplate;
40-
import org.springframework.integration.endpoint.EventDrivenConsumer;
41-
import org.springframework.integration.endpoint.PollingConsumer;
4232
import org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor;
4333
import org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice;
4434
import org.springframework.integration.history.MessageHistory;
4535
import org.springframework.integration.jms.ActiveMQMultiContextTests;
4636
import org.springframework.integration.jms.JmsOutboundGateway;
4737
import org.springframework.integration.jms.StubMessageConverter;
48-
import org.springframework.integration.support.MessageBuilder;
4938
import org.springframework.integration.test.util.TestUtils;
5039
import org.springframework.jms.listener.DefaultMessageListenerContainer;
51-
import org.springframework.jms.support.converter.MessageConverter;
5240
import org.springframework.messaging.Message;
5341
import org.springframework.messaging.MessageChannel;
5442
import org.springframework.messaging.MessageHandler;
@@ -67,145 +55,90 @@ public class JmsOutboundGatewayParserTests extends ActiveMQMultiContextTests {
6755

6856
@Test
6957
public void testWithDeliveryPersistentAttribute() {
70-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
71-
"jmsOutboundGatewayWithDeliveryPersistent.xml", this.getClass());
72-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGateway");
73-
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
74-
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
75-
accessor = new DirectFieldAccessor(gateway);
76-
int deliveryMode = (Integer) accessor.getPropertyValue("deliveryMode");
77-
assertThat(deliveryMode).isEqualTo(DeliveryMode.PERSISTENT);
78-
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isTrue();
79-
DefaultMessageListenerContainer container = TestUtils.getPropertyValue(gateway, "replyContainer",
80-
DefaultMessageListenerContainer.class);
81-
assertThat(TestUtils.getPropertyValue(container, "concurrentConsumers")).isEqualTo(4);
82-
assertThat(TestUtils.getPropertyValue(container, "maxConcurrentConsumers")).isEqualTo(5);
83-
assertThat(TestUtils.getPropertyValue(container, "maxMessagesPerTask")).isEqualTo(10);
84-
assertThat(TestUtils.getPropertyValue(container, "receiveTimeout")).isEqualTo(2000L);
85-
Object recoveryInterval;
86-
try {
87-
recoveryInterval = TestUtils.getPropertyValue(container, "recoveryInterval");
58+
try (var context = new ClassPathXmlApplicationContext(
59+
"jmsOutboundGatewayWithDeliveryPersistent.xml", getClass())) {
60+
61+
var endpoint = context.getBean("jmsGateway");
62+
var gateway = TestUtils.getPropertyValue(endpoint, "handler");
63+
assertThat(TestUtils.getPropertyValue(gateway, "deliveryMode")).isEqualTo(DeliveryMode.PERSISTENT);
64+
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isTrue();
65+
var container = TestUtils.getPropertyValue(gateway, "replyContainer",
66+
DefaultMessageListenerContainer.class);
67+
assertThat(TestUtils.getPropertyValue(container, "concurrentConsumers")).isEqualTo(4);
68+
assertThat(TestUtils.getPropertyValue(container, "maxConcurrentConsumers")).isEqualTo(5);
69+
assertThat(TestUtils.getPropertyValue(container, "maxMessagesPerTask")).isEqualTo(10);
70+
assertThat(TestUtils.getPropertyValue(container, "receiveTimeout")).isEqualTo(2000L);
71+
assertThat(TestUtils.getPropertyValue(container, "backOff.interval")).isEqualTo(10000L);
72+
assertThat(TestUtils.getPropertyValue(container, "idleConsumerLimit")).isEqualTo(7);
73+
assertThat(TestUtils.getPropertyValue(container, "idleTaskExecutionLimit")).isEqualTo(2);
74+
assertThat(TestUtils.getPropertyValue(container, "cacheLevel")).isEqualTo(3);
75+
assertThat(container.isSessionTransacted()).isTrue();
76+
assertThat(TestUtils.getPropertyValue(container, "taskExecutor")).isSameAs(context.getBean("exec"));
77+
assertThat(TestUtils.getPropertyValue(gateway, "idleReplyContainerTimeout")).isEqualTo(1234000L);
8878
}
89-
catch (NotReadablePropertyException e) {
90-
recoveryInterval = TestUtils.getPropertyValue(container, "backOff.interval");
91-
}
92-
assertThat(recoveryInterval).isEqualTo(10000L);
93-
94-
assertThat(TestUtils.getPropertyValue(container, "idleConsumerLimit")).isEqualTo(7);
95-
assertThat(TestUtils.getPropertyValue(container, "idleTaskExecutionLimit")).isEqualTo(2);
96-
assertThat(TestUtils.getPropertyValue(container, "cacheLevel")).isEqualTo(3);
97-
assertThat(container.isSessionTransacted()).isTrue();
98-
assertThat(TestUtils.getPropertyValue(container, "taskExecutor")).isSameAs(context.getBean("exec"));
99-
assertThat(TestUtils.getPropertyValue(gateway, "idleReplyContainerTimeout")).isEqualTo(1234000L);
100-
context.close();
10179
}
10280

10381
@Test
10482
public void testAdvised() {
105-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
106-
"jmsOutboundGatewayWithDeliveryPersistent.xml", this.getClass());
107-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("advised");
108-
JmsOutboundGateway gateway = TestUtils.getPropertyValue(endpoint, "handler", JmsOutboundGateway.class);
109-
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isFalse();
110-
gateway.handleMessage(new GenericMessage<>("foo"));
111-
assertThat(adviceCalled).isEqualTo(1);
112-
assertThat(TestUtils.getPropertyValue(gateway, "replyContainer.sessionAcknowledgeMode")).isEqualTo(3);
113-
context.close();
83+
try (var context = new ClassPathXmlApplicationContext(
84+
"jmsOutboundGatewayWithDeliveryPersistent.xml", getClass())) {
85+
86+
var endpoint = context.getBean("advised");
87+
JmsOutboundGateway gateway = TestUtils.getPropertyValue(endpoint, "handler", JmsOutboundGateway.class);
88+
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isFalse();
89+
gateway.handleMessage(new GenericMessage<>("foo"));
90+
assertThat(adviceCalled).isEqualTo(1);
91+
assertThat(TestUtils.getPropertyValue(gateway, "replyContainer.sessionAcknowledgeMode")).isEqualTo(3);
92+
}
11493
}
11594

11695
@Test
11796
public void testDefault() {
118-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
119-
"jmsOutboundGatewayWithConverter.xml", this.getClass());
120-
PollingConsumer endpoint = (PollingConsumer) context.getBean("jmsGateway");
121-
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
122-
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
123-
accessor = new DirectFieldAccessor(gateway);
124-
MessageConverter converter = (MessageConverter) accessor.getPropertyValue("messageConverter");
125-
assertThat(converter instanceof StubMessageConverter).as("Wrong message converter").isTrue();
126-
context.close();
97+
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithConverter.xml", getClass())) {
98+
var endpoint = context.getBean("jmsGateway");
99+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.messageConverter"))
100+
.isInstanceOf(StubMessageConverter.class);
101+
}
127102
}
128103

129104
@Test
130105
public void gatewayWithOrder() {
131-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
132-
"jmsOutboundGatewayWithOrder.xml", this.getClass());
133-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGateway");
134-
DirectFieldAccessor accessor = new DirectFieldAccessor(
135-
new DirectFieldAccessor(endpoint).getPropertyValue("handler"));
136-
Object order = accessor.getPropertyValue("order");
137-
assertThat(order).isEqualTo(99);
138-
assertThat(accessor.getPropertyValue("requiresReply")).isEqualTo(Boolean.TRUE);
139-
context.close();
106+
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithOrder.xml", getClass())) {
107+
var endpoint = context.getBean("jmsGateway");
108+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.requiresReply")).isEqualTo(Boolean.TRUE);
109+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.order")).isEqualTo(99);
110+
}
140111
}
141112

142113
@Test
143114
public void gatewayWithDest() {
144-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
145-
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
146-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDest");
147-
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
148-
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
149-
accessor = new DirectFieldAccessor(gateway);
150-
assertThat(accessor.getPropertyValue("replyDestination")).isSameAs(context.getBean("replyQueue"));
151-
context.close();
115+
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayReplyDestOptions.xml", getClass())) {
116+
var endpoint = context.getBean("jmsGatewayDest");
117+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyDestination"))
118+
.isSameAs(context.getBean("replyQueue"));
119+
}
152120
}
153121

154122
@Test
155123
public void gatewayWithDestName() {
156-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
157-
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
158-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDestName");
159-
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
160-
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
161-
accessor = new DirectFieldAccessor(gateway);
162-
assertThat(accessor.getPropertyValue("replyDestinationName")).isEqualTo("replyQueueName");
163-
context.close();
164-
}
165-
166-
@Test
167-
public void gatewayWithDestExpression() throws Exception {
168-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
169-
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
170-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDestExpression");
171-
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
172-
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
173-
ExpressionEvaluatingMessageProcessor<?> processor =
174-
TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor",
175-
ExpressionEvaluatingMessageProcessor.class);
176-
Expression expression = TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor.expression",
177-
Expression.class);
178-
assertThat(expression.getExpressionString()).isEqualTo("payload");
179-
Message<?> message = MessageBuilder.withPayload("foo").build();
180-
assertThat(processor.processMessage(message)).isEqualTo("foo");
181-
182-
Method method =
183-
JmsOutboundGateway.class.getDeclaredMethod("determineReplyDestination", Message.class, Session.class);
184-
method.setAccessible(true);
185-
186-
Session session = mock(Session.class);
187-
Queue queue = mock(Queue.class);
188-
when(session.createQueue("foo")).thenReturn(queue);
189-
Destination replyQ = (Destination) method.invoke(gateway, message, session);
190-
assertThat(replyQ).isSameAs(queue);
191-
context.close();
124+
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayReplyDestOptions.xml", getClass())) {
125+
var endpoint = context.getBean("jmsGatewayDestName");
126+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyDestinationName")).isEqualTo("replyQueueName");
127+
}
192128
}
193129

194130
@Test
195131
public void gatewayWithDestBeanRefExpression() {
196-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
197-
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
198-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDestExpressionBeanRef");
199-
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
200-
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
201-
ExpressionEvaluatingMessageProcessor<?> processor =
202-
TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor",
203-
ExpressionEvaluatingMessageProcessor.class);
204-
Expression expression = TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor.expression",
205-
Expression.class);
206-
assertThat(expression.getExpressionString()).isEqualTo("@replyQueue");
207-
assertThat(processor.processMessage(null)).isSameAs(context.getBean("replyQueue"));
208-
context.close();
132+
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayReplyDestOptions.xml", getClass())) {
133+
var endpoint = context.getBean("jmsGatewayDestExpressionBeanRef");
134+
var processor =
135+
TestUtils.getPropertyValue(endpoint, "handler.replyDestinationExpressionProcessor",
136+
ExpressionEvaluatingMessageProcessor.class);
137+
var expression = TestUtils.getPropertyValue(endpoint,
138+
"handler.replyDestinationExpressionProcessor.expression", Expression.class);
139+
assertThat(expression.getExpressionString()).isEqualTo("@replyQueue");
140+
assertThat(processor.processMessage(null)).isSameAs(context.getBean("replyQueue"));
141+
}
209142
}
210143

211144
@Test
@@ -220,20 +153,20 @@ public void gatewayWithDestAndDestExpression() {
220153

221154
@Test
222155
public void gatewayMaintainsReplyChannelAndInboundHistory() {
223-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
224-
"gatewayMaintainsReplyChannel.xml", this.getClass());
156+
var context = new ClassPathXmlApplicationContext("gatewayMaintainsReplyChannel.xml", getClass());
225157
SampleGateway gateway = context.getBean("gateway", SampleGateway.class);
226158
SubscribableChannel jmsInput = context.getBean("jmsInput", SubscribableChannel.class);
227-
MessageHandler handler = message -> {
228-
MessageHistory history = MessageHistory.read(message);
229-
assertThat(history).isNotNull();
230-
Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "inboundGateway", 0);
231-
assertThat(componentHistoryRecord).isNotNull();
232-
assertThat(componentHistoryRecord.get("type")).isEqualTo("jms:inbound-gateway");
233-
MessagingTemplate messagingTemplate = new MessagingTemplate();
234-
messagingTemplate.setDefaultDestination((MessageChannel) message.getHeaders().getReplyChannel());
235-
messagingTemplate.send(message);
236-
};
159+
MessageHandler handler =
160+
message -> {
161+
MessageHistory history = MessageHistory.read(message);
162+
assertThat(history).isNotNull();
163+
Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "inboundGateway", 0);
164+
assertThat(componentHistoryRecord).isNotNull();
165+
assertThat(componentHistoryRecord.get("type")).isEqualTo("jms:inbound-gateway");
166+
MessagingTemplate messagingTemplate = new MessagingTemplate();
167+
messagingTemplate.setDefaultDestination((MessageChannel) message.getHeaders().getReplyChannel());
168+
messagingTemplate.send(message);
169+
};
237170
jmsInput.subscribe(handler);
238171
String result = gateway.echo("hello");
239172
assertThat(result).isEqualTo("hello");
@@ -248,26 +181,20 @@ public void gatewayMaintainsReplyChannelAndInboundHistory() {
248181

249182
@Test
250183
public void gatewayWithDefaultPubSubDomain() {
251-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
252-
"jmsOutboundGatewayWithPubSubSettings.xml", this.getClass());
253-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("defaultGateway");
254-
DirectFieldAccessor accessor = new DirectFieldAccessor(
255-
new DirectFieldAccessor(endpoint).getPropertyValue("handler"));
256-
assertThat((Boolean) accessor.getPropertyValue("requestPubSubDomain")).isFalse();
257-
assertThat((Boolean) accessor.getPropertyValue("replyPubSubDomain")).isFalse();
258-
context.close();
184+
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithPubSubSettings.xml", getClass())) {
185+
var endpoint = context.getBean("defaultGateway");
186+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.requestPubSubDomain", Boolean.class)).isFalse();
187+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyPubSubDomain", Boolean.class)).isFalse();
188+
}
259189
}
260190

261191
@Test
262192
public void gatewayWithExplicitPubSubDomainTrue() {
263-
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
264-
"jmsOutboundGatewayWithPubSubSettings.xml", this.getClass());
265-
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("pubSubDomainGateway");
266-
DirectFieldAccessor accessor = new DirectFieldAccessor(
267-
new DirectFieldAccessor(endpoint).getPropertyValue("handler"));
268-
assertThat((Boolean) accessor.getPropertyValue("requestPubSubDomain")).isTrue();
269-
assertThat((Boolean) accessor.getPropertyValue("replyPubSubDomain")).isTrue();
270-
context.close();
193+
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithPubSubSettings.xml", getClass())) {
194+
var endpoint = context.getBean("pubSubDomainGateway");
195+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.requestPubSubDomain", Boolean.class)).isTrue();
196+
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyPubSubDomain", Boolean.class)).isTrue();
197+
}
271198
}
272199

273200

spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundGatewayReplyDestOptions.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@
2222
request-channel="requestChannel"
2323
reply-destination-name="replyQueueName"/>
2424

25-
<jms:outbound-gateway id="jmsGatewayDestExpression"
26-
request-destination="requestQueue"
27-
request-channel="requestChannel"
28-
reply-destination-expression="payload"/>
29-
3025
<jms:outbound-gateway id="jmsGatewayDestExpressionBeanRef"
3126
request-destination="requestQueue"
3227
request-channel="requestChannel"

0 commit comments

Comments
 (0)