From e4ed93acbfb917f6cbafd3d124e7e9a5b978032e Mon Sep 17 00:00:00 2001 From: Henning Garus Date: Wed, 9 Sep 2020 10:32:21 +0200 Subject: [PATCH] Autoconfigure a basic ConnectionFactory as RabbitMockConnectionFactory (#1499) * Autoconfigure a basic ConnectionFactory as RabbitMockConnectionFactory Autoconfigure a barebones ConnectionFactory implementation instead of CachingConnectionFactory. CachingConnectionFactory would require additional mocking to support its transaction tracking and caching the mocked connection isn't necessary. Fixes gh-1259 * Add Test Co-authored-by: Henning Garus --- ...ockConnectionFactoryAutoConfiguration.java | 10 +++++-- ...actVerifierAmqpAutoConfigurationTests.java | 30 +++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java index d94c74a5a0..0225475d22 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/messaging/amqp/RabbitMockConnectionFactoryAutoConfiguration.java @@ -23,12 +23,13 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; +import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.lang.NonNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -79,8 +80,11 @@ public class RabbitMockConnectionFactoryAutoConfiguration { catch (Exception e) { throw new RuntimeException(e); } - return new CachingConnectionFactory(mockConnectionFactory) { - + return new AbstractConnectionFactory(mockConnectionFactory) { + @Override + public @NonNull org.springframework.amqp.rabbit.connection.Connection createConnection() { + return super.createBareConnection(); + } }; } diff --git a/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/ContractVerifierAmqpAutoConfigurationTests.java b/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/ContractVerifierAmqpAutoConfigurationTests.java index 46daeb629f..4dc5bc71c6 100644 --- a/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/ContractVerifierAmqpAutoConfigurationTests.java +++ b/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/messaging/amqp/ContractVerifierAmqpAutoConfigurationTests.java @@ -18,21 +18,31 @@ package org.springframework.cloud.contract.verifier.messaging.amqp; import org.junit.Test; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.boot.test.mock.mockito.MockitoPostProcessor; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; /** * @author Tim Ysewyn + * @author Henning Garus */ public class ContractVerifierAmqpAutoConfigurationTests { private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(RabbitAutoConfiguration.class, ContractVerifierAmqpAutoConfiguration.class, - RabbitMockConnectionFactoryAutoConfiguration.class)); + RabbitMockConnectionFactoryAutoConfiguration.class)) + // register MockitoPostProcessor manually to perform the SpyBean injection for + // ContractVerifierAmqpAutoConfiguration. This is normally done automatically + // during test setup + .withInitializer(context -> MockitoPostProcessor + .register((BeanDefinitionRegistry) context)); @Test public void shouldNotCreateBeansByDefault() { @@ -55,7 +65,23 @@ public class ContractVerifierAmqpAutoConfigurationTests { @Test public void shouldCreateBeansWhenExplicitlyEnabled() { - // TODO + this.contextRunner.withPropertyValues("stubrunner.amqp.enabled=true") + .run((context) -> { + assertThat(context.getBeansOfType(SpringAmqpStubMessages.class)) + .hasSize(1); + assertThat(context.getBeansOfType(ContractVerifierHelper.class)) + .hasSize(1); + }); + } + + @Test + public void shouldNotThrowOnSendWhenRabbitTemplateIsTransacted() { + this.contextRunner.withPropertyValues("stubrunner.amqp.enabled=true") + .run(context -> assertThatCode(() -> { + RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class); + rabbitTemplate.setChannelTransacted(true); + rabbitTemplate.convertAndSend("A Message"); + }).doesNotThrowAnyException()); } }