GH-3873: Remove JMS test for private method
Fixes https://github.com/spring-projects/spring-integration/issues/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()`.
This commit is contained in:
@@ -46,6 +46,7 @@ import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
import org.springframework.integration.expression.ValueExpression;
|
||||
import org.springframework.integration.jms.JmsOutboundGateway.ReplyContainerProperties;
|
||||
import org.springframework.integration.test.util.TestUtils;
|
||||
import org.springframework.integration.util.ErrorHandlingTaskExecutor;
|
||||
@@ -161,7 +162,7 @@ public class JmsOutboundGatewayTests extends ActiveMQMultiContextTests {
|
||||
String requestQ = "requests1";
|
||||
gateway.setRequestDestinationName(requestQ);
|
||||
String replyQ = "replies1";
|
||||
gateway.setReplyDestinationName(replyQ);
|
||||
gateway.setReplyDestinationExpression(new ValueExpression<>(replyQ));
|
||||
QueueChannel queueChannel = new QueueChannel();
|
||||
gateway.setOutputChannel(queueChannel);
|
||||
gateway.setBeanFactory(mock(BeanFactory.class));
|
||||
|
||||
@@ -18,37 +18,25 @@ package org.springframework.integration.jms.config;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Properties;
|
||||
|
||||
import jakarta.jms.DeliveryMode;
|
||||
import jakarta.jms.Destination;
|
||||
import jakarta.jms.Queue;
|
||||
import jakarta.jms.Session;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.NotReadablePropertyException;
|
||||
import org.springframework.beans.factory.parsing.BeanDefinitionParsingException;
|
||||
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.integration.core.MessagingTemplate;
|
||||
import org.springframework.integration.endpoint.EventDrivenConsumer;
|
||||
import org.springframework.integration.endpoint.PollingConsumer;
|
||||
import org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor;
|
||||
import org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice;
|
||||
import org.springframework.integration.history.MessageHistory;
|
||||
import org.springframework.integration.jms.ActiveMQMultiContextTests;
|
||||
import org.springframework.integration.jms.JmsOutboundGateway;
|
||||
import org.springframework.integration.jms.StubMessageConverter;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.integration.test.util.TestUtils;
|
||||
import org.springframework.jms.listener.DefaultMessageListenerContainer;
|
||||
import org.springframework.jms.support.converter.MessageConverter;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.MessageChannel;
|
||||
import org.springframework.messaging.MessageHandler;
|
||||
@@ -67,145 +55,90 @@ public class JmsOutboundGatewayParserTests extends ActiveMQMultiContextTests {
|
||||
|
||||
@Test
|
||||
public void testWithDeliveryPersistentAttribute() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithDeliveryPersistent.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGateway");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
|
||||
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
|
||||
accessor = new DirectFieldAccessor(gateway);
|
||||
int deliveryMode = (Integer) accessor.getPropertyValue("deliveryMode");
|
||||
assertThat(deliveryMode).isEqualTo(DeliveryMode.PERSISTENT);
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isTrue();
|
||||
DefaultMessageListenerContainer container = TestUtils.getPropertyValue(gateway, "replyContainer",
|
||||
DefaultMessageListenerContainer.class);
|
||||
assertThat(TestUtils.getPropertyValue(container, "concurrentConsumers")).isEqualTo(4);
|
||||
assertThat(TestUtils.getPropertyValue(container, "maxConcurrentConsumers")).isEqualTo(5);
|
||||
assertThat(TestUtils.getPropertyValue(container, "maxMessagesPerTask")).isEqualTo(10);
|
||||
assertThat(TestUtils.getPropertyValue(container, "receiveTimeout")).isEqualTo(2000L);
|
||||
Object recoveryInterval;
|
||||
try {
|
||||
recoveryInterval = TestUtils.getPropertyValue(container, "recoveryInterval");
|
||||
}
|
||||
catch (NotReadablePropertyException e) {
|
||||
recoveryInterval = TestUtils.getPropertyValue(container, "backOff.interval");
|
||||
}
|
||||
assertThat(recoveryInterval).isEqualTo(10000L);
|
||||
try (var context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithDeliveryPersistent.xml", getClass())) {
|
||||
|
||||
assertThat(TestUtils.getPropertyValue(container, "idleConsumerLimit")).isEqualTo(7);
|
||||
assertThat(TestUtils.getPropertyValue(container, "idleTaskExecutionLimit")).isEqualTo(2);
|
||||
assertThat(TestUtils.getPropertyValue(container, "cacheLevel")).isEqualTo(3);
|
||||
assertThat(container.isSessionTransacted()).isTrue();
|
||||
assertThat(TestUtils.getPropertyValue(container, "taskExecutor")).isSameAs(context.getBean("exec"));
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "idleReplyContainerTimeout")).isEqualTo(1234000L);
|
||||
context.close();
|
||||
var endpoint = context.getBean("jmsGateway");
|
||||
var gateway = TestUtils.getPropertyValue(endpoint, "handler");
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "deliveryMode")).isEqualTo(DeliveryMode.PERSISTENT);
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isTrue();
|
||||
var container = TestUtils.getPropertyValue(gateway, "replyContainer",
|
||||
DefaultMessageListenerContainer.class);
|
||||
assertThat(TestUtils.getPropertyValue(container, "concurrentConsumers")).isEqualTo(4);
|
||||
assertThat(TestUtils.getPropertyValue(container, "maxConcurrentConsumers")).isEqualTo(5);
|
||||
assertThat(TestUtils.getPropertyValue(container, "maxMessagesPerTask")).isEqualTo(10);
|
||||
assertThat(TestUtils.getPropertyValue(container, "receiveTimeout")).isEqualTo(2000L);
|
||||
assertThat(TestUtils.getPropertyValue(container, "backOff.interval")).isEqualTo(10000L);
|
||||
assertThat(TestUtils.getPropertyValue(container, "idleConsumerLimit")).isEqualTo(7);
|
||||
assertThat(TestUtils.getPropertyValue(container, "idleTaskExecutionLimit")).isEqualTo(2);
|
||||
assertThat(TestUtils.getPropertyValue(container, "cacheLevel")).isEqualTo(3);
|
||||
assertThat(container.isSessionTransacted()).isTrue();
|
||||
assertThat(TestUtils.getPropertyValue(container, "taskExecutor")).isSameAs(context.getBean("exec"));
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "idleReplyContainerTimeout")).isEqualTo(1234000L);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAdvised() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithDeliveryPersistent.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("advised");
|
||||
JmsOutboundGateway gateway = TestUtils.getPropertyValue(endpoint, "handler", JmsOutboundGateway.class);
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isFalse();
|
||||
gateway.handleMessage(new GenericMessage<>("foo"));
|
||||
assertThat(adviceCalled).isEqualTo(1);
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "replyContainer.sessionAcknowledgeMode")).isEqualTo(3);
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithDeliveryPersistent.xml", getClass())) {
|
||||
|
||||
var endpoint = context.getBean("advised");
|
||||
JmsOutboundGateway gateway = TestUtils.getPropertyValue(endpoint, "handler", JmsOutboundGateway.class);
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "async", Boolean.class)).isFalse();
|
||||
gateway.handleMessage(new GenericMessage<>("foo"));
|
||||
assertThat(adviceCalled).isEqualTo(1);
|
||||
assertThat(TestUtils.getPropertyValue(gateway, "replyContainer.sessionAcknowledgeMode")).isEqualTo(3);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefault() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithConverter.xml", this.getClass());
|
||||
PollingConsumer endpoint = (PollingConsumer) context.getBean("jmsGateway");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
|
||||
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
|
||||
accessor = new DirectFieldAccessor(gateway);
|
||||
MessageConverter converter = (MessageConverter) accessor.getPropertyValue("messageConverter");
|
||||
assertThat(converter instanceof StubMessageConverter).as("Wrong message converter").isTrue();
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithConverter.xml", getClass())) {
|
||||
var endpoint = context.getBean("jmsGateway");
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.messageConverter"))
|
||||
.isInstanceOf(StubMessageConverter.class);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gatewayWithOrder() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithOrder.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGateway");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(
|
||||
new DirectFieldAccessor(endpoint).getPropertyValue("handler"));
|
||||
Object order = accessor.getPropertyValue("order");
|
||||
assertThat(order).isEqualTo(99);
|
||||
assertThat(accessor.getPropertyValue("requiresReply")).isEqualTo(Boolean.TRUE);
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithOrder.xml", getClass())) {
|
||||
var endpoint = context.getBean("jmsGateway");
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.requiresReply")).isEqualTo(Boolean.TRUE);
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.order")).isEqualTo(99);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gatewayWithDest() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDest");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
|
||||
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
|
||||
accessor = new DirectFieldAccessor(gateway);
|
||||
assertThat(accessor.getPropertyValue("replyDestination")).isSameAs(context.getBean("replyQueue"));
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayReplyDestOptions.xml", getClass())) {
|
||||
var endpoint = context.getBean("jmsGatewayDest");
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyDestination"))
|
||||
.isSameAs(context.getBean("replyQueue"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gatewayWithDestName() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDestName");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
|
||||
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
|
||||
accessor = new DirectFieldAccessor(gateway);
|
||||
assertThat(accessor.getPropertyValue("replyDestinationName")).isEqualTo("replyQueueName");
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gatewayWithDestExpression() throws Exception {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDestExpression");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
|
||||
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
|
||||
ExpressionEvaluatingMessageProcessor<?> processor =
|
||||
TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor",
|
||||
ExpressionEvaluatingMessageProcessor.class);
|
||||
Expression expression = TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor.expression",
|
||||
Expression.class);
|
||||
assertThat(expression.getExpressionString()).isEqualTo("payload");
|
||||
Message<?> message = MessageBuilder.withPayload("foo").build();
|
||||
assertThat(processor.processMessage(message)).isEqualTo("foo");
|
||||
|
||||
Method method =
|
||||
JmsOutboundGateway.class.getDeclaredMethod("determineReplyDestination", Message.class, Session.class);
|
||||
method.setAccessible(true);
|
||||
|
||||
Session session = mock(Session.class);
|
||||
Queue queue = mock(Queue.class);
|
||||
when(session.createQueue("foo")).thenReturn(queue);
|
||||
Destination replyQ = (Destination) method.invoke(gateway, message, session);
|
||||
assertThat(replyQ).isSameAs(queue);
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayReplyDestOptions.xml", getClass())) {
|
||||
var endpoint = context.getBean("jmsGatewayDestName");
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyDestinationName")).isEqualTo("replyQueueName");
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gatewayWithDestBeanRefExpression() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayReplyDestOptions.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("jmsGatewayDestExpressionBeanRef");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(endpoint);
|
||||
JmsOutboundGateway gateway = (JmsOutboundGateway) accessor.getPropertyValue("handler");
|
||||
ExpressionEvaluatingMessageProcessor<?> processor =
|
||||
TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor",
|
||||
ExpressionEvaluatingMessageProcessor.class);
|
||||
Expression expression = TestUtils.getPropertyValue(gateway, "replyDestinationExpressionProcessor.expression",
|
||||
Expression.class);
|
||||
assertThat(expression.getExpressionString()).isEqualTo("@replyQueue");
|
||||
assertThat(processor.processMessage(null)).isSameAs(context.getBean("replyQueue"));
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayReplyDestOptions.xml", getClass())) {
|
||||
var endpoint = context.getBean("jmsGatewayDestExpressionBeanRef");
|
||||
var processor =
|
||||
TestUtils.getPropertyValue(endpoint, "handler.replyDestinationExpressionProcessor",
|
||||
ExpressionEvaluatingMessageProcessor.class);
|
||||
var expression = TestUtils.getPropertyValue(endpoint,
|
||||
"handler.replyDestinationExpressionProcessor.expression", Expression.class);
|
||||
assertThat(expression.getExpressionString()).isEqualTo("@replyQueue");
|
||||
assertThat(processor.processMessage(null)).isSameAs(context.getBean("replyQueue"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -220,20 +153,20 @@ public class JmsOutboundGatewayParserTests extends ActiveMQMultiContextTests {
|
||||
|
||||
@Test
|
||||
public void gatewayMaintainsReplyChannelAndInboundHistory() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"gatewayMaintainsReplyChannel.xml", this.getClass());
|
||||
var context = new ClassPathXmlApplicationContext("gatewayMaintainsReplyChannel.xml", getClass());
|
||||
SampleGateway gateway = context.getBean("gateway", SampleGateway.class);
|
||||
SubscribableChannel jmsInput = context.getBean("jmsInput", SubscribableChannel.class);
|
||||
MessageHandler handler = message -> {
|
||||
MessageHistory history = MessageHistory.read(message);
|
||||
assertThat(history).isNotNull();
|
||||
Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "inboundGateway", 0);
|
||||
assertThat(componentHistoryRecord).isNotNull();
|
||||
assertThat(componentHistoryRecord.get("type")).isEqualTo("jms:inbound-gateway");
|
||||
MessagingTemplate messagingTemplate = new MessagingTemplate();
|
||||
messagingTemplate.setDefaultDestination((MessageChannel) message.getHeaders().getReplyChannel());
|
||||
messagingTemplate.send(message);
|
||||
};
|
||||
MessageHandler handler =
|
||||
message -> {
|
||||
MessageHistory history = MessageHistory.read(message);
|
||||
assertThat(history).isNotNull();
|
||||
Properties componentHistoryRecord = TestUtils.locateComponentInHistory(history, "inboundGateway", 0);
|
||||
assertThat(componentHistoryRecord).isNotNull();
|
||||
assertThat(componentHistoryRecord.get("type")).isEqualTo("jms:inbound-gateway");
|
||||
MessagingTemplate messagingTemplate = new MessagingTemplate();
|
||||
messagingTemplate.setDefaultDestination((MessageChannel) message.getHeaders().getReplyChannel());
|
||||
messagingTemplate.send(message);
|
||||
};
|
||||
jmsInput.subscribe(handler);
|
||||
String result = gateway.echo("hello");
|
||||
assertThat(result).isEqualTo("hello");
|
||||
@@ -248,26 +181,20 @@ public class JmsOutboundGatewayParserTests extends ActiveMQMultiContextTests {
|
||||
|
||||
@Test
|
||||
public void gatewayWithDefaultPubSubDomain() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithPubSubSettings.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("defaultGateway");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(
|
||||
new DirectFieldAccessor(endpoint).getPropertyValue("handler"));
|
||||
assertThat((Boolean) accessor.getPropertyValue("requestPubSubDomain")).isFalse();
|
||||
assertThat((Boolean) accessor.getPropertyValue("replyPubSubDomain")).isFalse();
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithPubSubSettings.xml", getClass())) {
|
||||
var endpoint = context.getBean("defaultGateway");
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.requestPubSubDomain", Boolean.class)).isFalse();
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyPubSubDomain", Boolean.class)).isFalse();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void gatewayWithExplicitPubSubDomainTrue() {
|
||||
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
|
||||
"jmsOutboundGatewayWithPubSubSettings.xml", this.getClass());
|
||||
EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("pubSubDomainGateway");
|
||||
DirectFieldAccessor accessor = new DirectFieldAccessor(
|
||||
new DirectFieldAccessor(endpoint).getPropertyValue("handler"));
|
||||
assertThat((Boolean) accessor.getPropertyValue("requestPubSubDomain")).isTrue();
|
||||
assertThat((Boolean) accessor.getPropertyValue("replyPubSubDomain")).isTrue();
|
||||
context.close();
|
||||
try (var context = new ClassPathXmlApplicationContext("jmsOutboundGatewayWithPubSubSettings.xml", getClass())) {
|
||||
var endpoint = context.getBean("pubSubDomainGateway");
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.requestPubSubDomain", Boolean.class)).isTrue();
|
||||
assertThat(TestUtils.getPropertyValue(endpoint, "handler.replyPubSubDomain", Boolean.class)).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,11 +22,6 @@
|
||||
request-channel="requestChannel"
|
||||
reply-destination-name="replyQueueName"/>
|
||||
|
||||
<jms:outbound-gateway id="jmsGatewayDestExpression"
|
||||
request-destination="requestQueue"
|
||||
request-channel="requestChannel"
|
||||
reply-destination-expression="payload"/>
|
||||
|
||||
<jms:outbound-gateway id="jmsGatewayDestExpressionBeanRef"
|
||||
request-destination="requestQueue"
|
||||
request-channel="requestChannel"
|
||||
|
||||
Reference in New Issue
Block a user