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 <henning.garus@exxeta.com>
This commit is contained in:
Henning Garus
2020-09-09 10:32:21 +02:00
committed by Marcin Grzejszczak
parent 0f338ca5a0
commit e4ed93acbf
2 changed files with 35 additions and 5 deletions

View File

@@ -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();
}
};
}

View File

@@ -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());
}
}