|
|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2012-2019 the original author or authors. |
|
|
|
|
* Copyright 2012-2020 the original author or authors. |
|
|
|
|
* |
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
|
@ -16,18 +16,17 @@
@@ -16,18 +16,17 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.boot.autoconfigure.jdbc; |
|
|
|
|
|
|
|
|
|
import java.util.UUID; |
|
|
|
|
|
|
|
|
|
import javax.sql.DataSource; |
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
|
|
|
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigurations; |
|
|
|
|
import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration; |
|
|
|
|
import org.springframework.boot.test.util.TestPropertyValues; |
|
|
|
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
|
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
|
import org.springframework.boot.test.context.runner.ApplicationContextRunner; |
|
|
|
|
import org.springframework.jdbc.datasource.DataSourceTransactionManager; |
|
|
|
|
import org.springframework.transaction.PlatformTransactionManager; |
|
|
|
|
import org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; |
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
|
import static org.mockito.Mockito.mock; |
|
|
|
|
@ -41,82 +40,65 @@ import static org.mockito.Mockito.mock;
@@ -41,82 +40,65 @@ import static org.mockito.Mockito.mock;
|
|
|
|
|
*/ |
|
|
|
|
class DataSourceTransactionManagerAutoConfigurationTests { |
|
|
|
|
|
|
|
|
|
private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void testDataSourceExists() { |
|
|
|
|
this.context.register(EmbeddedDataSourceConfiguration.class, |
|
|
|
|
DataSourceTransactionManagerAutoConfiguration.class, TransactionAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBean(DataSource.class)).isNotNull(); |
|
|
|
|
assertThat(this.context.getBean(DataSourceTransactionManager.class)).isNotNull(); |
|
|
|
|
} |
|
|
|
|
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() |
|
|
|
|
.withConfiguration(AutoConfigurations.of(TransactionAutoConfiguration.class, |
|
|
|
|
DataSourceTransactionManagerAutoConfiguration.class)) |
|
|
|
|
.withPropertyValues("spring.datasource.url:jdbc:hsqldb:mem:test-" + UUID.randomUUID()); |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void testNoDataSourceExists() { |
|
|
|
|
this.context.register(DataSourceTransactionManagerAutoConfiguration.class, TransactionAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBeanNamesForType(DataSource.class)).isEmpty(); |
|
|
|
|
assertThat(this.context.getBeanNamesForType(DataSourceTransactionManager.class)).isEmpty(); |
|
|
|
|
void transactionManagerWithoutDataSourceIsNotConfigured() { |
|
|
|
|
this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(DataSourceTransactionManager.class)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void testManualConfiguration() { |
|
|
|
|
this.context.register(EmbeddedDataSourceConfiguration.class, |
|
|
|
|
DataSourceTransactionManagerAutoConfiguration.class, TransactionAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBean(DataSource.class)).isNotNull(); |
|
|
|
|
assertThat(this.context.getBean(DataSourceTransactionManager.class)).isNotNull(); |
|
|
|
|
void transactionManagerWithExistingDataSourceIsConfigured() { |
|
|
|
|
this.contextRunner.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) |
|
|
|
|
.run((context) -> { |
|
|
|
|
assertThat(context).hasSingleBean(PlatformTransactionManager.class) |
|
|
|
|
.hasSingleBean(DataSourceTransactionManager.class); |
|
|
|
|
assertThat(context.getBean(DataSourceTransactionManager.class).getDataSource()) |
|
|
|
|
.isSameAs(context.getBean(DataSource.class)); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void testExistingTransactionManager() { |
|
|
|
|
this.context.register(TransactionManagerConfiguration.class, EmbeddedDataSourceConfiguration.class, |
|
|
|
|
DataSourceTransactionManagerAutoConfiguration.class, TransactionAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBeansOfType(PlatformTransactionManager.class)).hasSize(1); |
|
|
|
|
assertThat(this.context.getBean(PlatformTransactionManager.class)) |
|
|
|
|
.isEqualTo(this.context.getBean("myTransactionManager")); |
|
|
|
|
void transactionManagerWithCustomizationIsConfigured() { |
|
|
|
|
this.contextRunner.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) |
|
|
|
|
.withPropertyValues("spring.transaction.default-timeout=1m", |
|
|
|
|
"spring.transaction.rollback-on-commit-failure=true") |
|
|
|
|
.run((context) -> { |
|
|
|
|
assertThat(context).hasSingleBean(PlatformTransactionManager.class) |
|
|
|
|
.hasSingleBean(DataSourceTransactionManager.class); |
|
|
|
|
DataSourceTransactionManager transactionManager = context |
|
|
|
|
.getBean(DataSourceTransactionManager.class); |
|
|
|
|
assertThat(transactionManager.getDefaultTimeout()).isEqualTo(60); |
|
|
|
|
assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue(); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void testMultiDataSource() { |
|
|
|
|
this.context.register(MultiDataSourceConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, |
|
|
|
|
TransactionAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBeansOfType(PlatformTransactionManager.class)).isEmpty(); |
|
|
|
|
void transactionManagerWithExistingTransactionManagerIsNotOverridden() { |
|
|
|
|
this.contextRunner |
|
|
|
|
.withBean("myTransactionManager", PlatformTransactionManager.class, |
|
|
|
|
() -> mock(PlatformTransactionManager.class)) |
|
|
|
|
.run((context) -> assertThat(context).hasSingleBean(PlatformTransactionManager.class) |
|
|
|
|
.hasBean("myTransactionManager")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void testMultiDataSourceUsingPrimary() { |
|
|
|
|
this.context.register(MultiDataSourceUsingPrimaryConfiguration.class, |
|
|
|
|
DataSourceTransactionManagerAutoConfiguration.class, TransactionAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
assertThat(this.context.getBean(DataSourceTransactionManager.class)).isNotNull(); |
|
|
|
|
assertThat(this.context.getBean(AbstractTransactionManagementConfiguration.class)).isNotNull(); |
|
|
|
|
void transactionWithMultipleDataSourcesIsNotConfigured() { |
|
|
|
|
this.contextRunner.withUserConfiguration(MultiDataSourceConfiguration.class) |
|
|
|
|
.run((context) -> assertThat(context).doesNotHaveBean(PlatformTransactionManager.class)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void testCustomizeDataSourceTransactionManagerUsingProperties() { |
|
|
|
|
TestPropertyValues |
|
|
|
|
.of("spring.transaction.default-timeout:30", "spring.transaction.rollback-on-commit-failure:true") |
|
|
|
|
.applyTo(this.context); |
|
|
|
|
this.context.register(EmbeddedDataSourceConfiguration.class, |
|
|
|
|
DataSourceTransactionManagerAutoConfiguration.class, TransactionAutoConfiguration.class); |
|
|
|
|
this.context.refresh(); |
|
|
|
|
DataSourceTransactionManager transactionManager = this.context.getBean(DataSourceTransactionManager.class); |
|
|
|
|
assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30); |
|
|
|
|
assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Configuration(proxyBeanMethods = false) |
|
|
|
|
static class TransactionManagerConfiguration { |
|
|
|
|
|
|
|
|
|
@Bean |
|
|
|
|
PlatformTransactionManager myTransactionManager() { |
|
|
|
|
return mock(PlatformTransactionManager.class); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void transactionWithMultipleDataSourcesAndPrimaryCandidateIsConfigured() { |
|
|
|
|
this.contextRunner.withUserConfiguration(MultiDataSourceUsingPrimaryConfiguration.class).run((context) -> { |
|
|
|
|
assertThat(context).hasSingleBean(PlatformTransactionManager.class) |
|
|
|
|
.hasSingleBean(DataSourceTransactionManager.class); |
|
|
|
|
assertThat(context.getBean(DataSourceTransactionManager.class).getDataSource()) |
|
|
|
|
.isSameAs(context.getBean("test1DataSource")); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|