From 00a643f9d82d276afd3710992286b547f7989628 Mon Sep 17 00:00:00 2001 From: "Michael J. Simons" Date: Mon, 29 May 2017 15:18:08 +0200 Subject: [PATCH 1/2] Add @JooqTest This commit provides test slicing for jOOQ. See gh-9343 --- .../main/asciidoc/spring-boot-features.adoc | 35 +++++++ spring-boot-test-autoconfigure/pom.xml | 5 + .../autoconfigure/jooq/AutoConfigureJooq.java | 41 ++++++++ .../test/autoconfigure/jooq/JooqTest.java | 97 +++++++++++++++++++ .../jooq/JooqTypeExcludeFilter.java | 73 ++++++++++++++ .../test/autoconfigure/jooq/package-info.java | 20 ++++ .../main/resources/META-INF/spring.factories | 9 ++ .../jooq/ExampleJooqApplication.java | 41 ++++++++ .../jooq/JooqTestIntegrationTests.java | 89 +++++++++++++++++ 9 files changed, 410 insertions(+) create mode 100644 spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/AutoConfigureJooq.java create mode 100644 spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java create mode 100644 spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTypeExcludeFilter.java create mode 100644 spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/package-info.java create mode 100644 spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/ExampleJooqApplication.java create mode 100644 spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 463bda3d6f..03df54bf6a 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -5832,6 +5832,41 @@ A list of the auto-configuration that is enabled by `@JdbcTest` can be +[[boot-features-testing-spring-boot-applications-testing-autoconfigured-jooq-test]] +==== Auto-configured jOOQ tests +`@JooqTest` is similar to `@JdbcTest` but for jOOQ related tests. By default it +will configure an in-memory embedded database and a `DSLContext`. Regular +`@Component` beans will not be loaded into the `ApplicationContext`: + +[source,java,indent=0] +---- + import org.jooq.DSLContext; + import org.junit.Test; + import org.junit.runner.RunWith; + import org.springframework.boot.test.autoconfigure.jooq.JooqTest; + import org.springframework.test.context.junit4.SpringRunner; + + @RunWith(SpringRunner.class) + @JooqTest + public class ExampleNonTransactionalTests { + @Autowired + DSLContext create; + } +---- + +JOOQ tests are also transactional and rollback at the end of each test by default. +If that's not what you want, you can disable transaction management for a test or for +the whole as shown with +<> + +If you prefer your test to run against a real database, you can use the +`@AutoConfigureTestDatabase` annotation the same way as for `JdbcTest` or `DataJpaTest`. + +A list of the auto-configuration that is enabled by `@JooqTest` can be +<>. + + + [[boot-features-testing-spring-boot-applications-testing-autoconfigured-mongo-test]] ==== Auto-configured Data MongoDB tests `@DataMongoTest` can be used if you want to test MongoDB applications. By default, it will diff --git a/spring-boot-test-autoconfigure/pom.xml b/spring-boot-test-autoconfigure/pom.xml index f85533a20b..d74912ecc2 100644 --- a/spring-boot-test-autoconfigure/pom.xml +++ b/spring-boot-test-autoconfigure/pom.xml @@ -227,5 +227,10 @@ de.flapdoodle.embed.mongo test + + org.jooq + jooq + test + diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/AutoConfigureJooq.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/AutoConfigureJooq.java new file mode 100644 index 0000000000..b563e12c2c --- /dev/null +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/AutoConfigureJooq.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.jooq; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; + +/** + * {@link ImportAutoConfiguration Auto-configuration imports} for typical jOOQ tests. Most + * tests should consider using {@link JooqTest @JooqTest} rather than using this + * annotation directly. + * + * @author Michael Simons + * @since 2.0.0 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@ImportAutoConfiguration +public @interface AutoConfigureJooq { + +} diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java new file mode 100644 index 0000000000..3d0760a2da --- /dev/null +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java @@ -0,0 +1,97 @@ +/* + * Copyright 2012-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.jooq; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; +import org.springframework.boot.test.autoconfigure.filter.TypeExcludeFilters; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.context.SpringBootTestContextBootstrapper; +import org.springframework.context.annotation.ComponentScan.Filter; +import org.springframework.core.annotation.AliasFor; +import org.springframework.test.context.BootstrapWith; +import org.springframework.transaction.annotation.Transactional; + +/** + * Annotation that can be used in combination with {@code @RunWith(SpringRunner.class)} + * for a typical jOOQ test. Can be used when a test focuses only on + * jOOQ-based components. + *

+ * Using this annotation will disable full auto-configuration and instead apply only + * configuration relevant to jOOQ tests. + *

+ * By default, tests annotated with {@code @JooqTest} will use an embedded in-memory + * database (replacing any explicit or usually auto-configured DataSource). Since + * jOOQ relies heavily on a Java-based schema that corresponds with the database schema, + * that is propably not what you want. The + * {@link AutoConfigureTestDatabase @AutoConfigureTestDatabase} annotation can be used + * to override these settings. + * + * @author Michael Simons + * @since 2.0.0 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@BootstrapWith(SpringBootTestContextBootstrapper.class) +@OverrideAutoConfiguration(enabled = false) +@TypeExcludeFilters(JooqTypeExcludeFilter.class) +@Transactional +@AutoConfigureJooq +@AutoConfigureTestDatabase +@ImportAutoConfiguration +public @interface JooqTest { + /** + * Determines if default filtering should be used with + * {@link SpringBootApplication @SpringBootApplication}. By default no beans are + * included. + * @see #includeFilters() + * @see #excludeFilters() + * @return if default filters should be used + */ + boolean useDefaultFilters() default true; + + /** + * A set of include filters which can be used to add otherwise filtered beans to the + * application context. + * @return include filters to apply + */ + Filter[] includeFilters() default {}; + + /** + * A set of exclude filters which can be used to filter beans that would otherwise be + * added to the application context. + * @return exclude filters to apply + */ + Filter[] excludeFilters() default {}; + + /** + * Auto-configuration exclusions that should be applied for this test. + * @return auto-configuration exclusions to apply + */ + @AliasFor(annotation = ImportAutoConfiguration.class, attribute = "exclude") + Class[] excludeAutoConfiguration() default {}; +} diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTypeExcludeFilter.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTypeExcludeFilter.java new file mode 100644 index 0000000000..654572da6e --- /dev/null +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTypeExcludeFilter.java @@ -0,0 +1,73 @@ +/* + * Copyright 2012-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.jooq; + +import java.util.Collections; +import java.util.Set; + +import org.springframework.boot.context.TypeExcludeFilter; +import org.springframework.boot.test.autoconfigure.filter.AnnotationCustomizableTypeExcludeFilter; +import org.springframework.context.annotation.ComponentScan.Filter; +import org.springframework.core.annotation.AnnotatedElementUtils; + +/** + * {@link TypeExcludeFilter} for {@link JooqTest @JooqTest}. + * + * @author Michael Simons + */ +class JooqTypeExcludeFilter extends AnnotationCustomizableTypeExcludeFilter { + + private final JooqTest annotation; + + JooqTypeExcludeFilter(Class testClass) { + this.annotation = AnnotatedElementUtils.getMergedAnnotation(testClass, + JooqTest.class); + } + + @Override + protected boolean hasAnnotation() { + return this.annotation != null; + } + + @Override + protected Filter[] getFilters(final FilterType type) { + switch (type) { + case INCLUDE: + return this.annotation.includeFilters(); + case EXCLUDE: + return this.annotation.excludeFilters(); + default: + throw new IllegalStateException("Unsupported type " + type); + } + } + + @Override + protected boolean isUseDefaultFilters() { + return this.annotation.useDefaultFilters(); + } + + @Override + protected Set> getDefaultIncludes() { + return Collections.emptySet(); + } + + @Override + protected Set> getComponentIncludes() { + return Collections.emptySet(); + } + +} diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/package-info.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/package-info.java new file mode 100644 index 0000000000..e6ac10d24c --- /dev/null +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Auto-configuration for jOOQ tests. + */ +package org.springframework.boot.test.autoconfigure.jooq; diff --git a/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories index 902ac5c42e..21066dbf36 100644 --- a/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories @@ -45,6 +45,15 @@ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration +# AutoConfigureJooq auto-configuration imports +org.springframework.boot.test.autoconfigure.jooq.AutoConfigureJooq=\ +org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ +org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ +org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ +org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ +org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ +org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration + # AutoConfigureTestDatabase auto-configuration imports org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase=\ org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration,\ diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/ExampleJooqApplication.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/ExampleJooqApplication.java new file mode 100644 index 0000000000..b5c8239309 --- /dev/null +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/ExampleJooqApplication.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.jooq; + +import javax.sql.DataSource; + +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +/** + * Example {@link SpringBootApplication} used with {@link JooqTest} tests. + * + * @author Michael Simons + */ +@SpringBootApplication +public class ExampleJooqApplication { + + @Bean + public DataSource dataSource() { + EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder() + .generateUniqueName(true).setType(EmbeddedDatabaseType.HSQL); + return builder.build(); + } + +} diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java new file mode 100644 index 0000000000..00e80b8fa4 --- /dev/null +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java @@ -0,0 +1,89 @@ +/* + * Copyright 2012-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.jooq; + +import javax.sql.DataSource; + +import org.jooq.DSLContext; +import org.jooq.SQLDialect; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; +import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration; +import org.springframework.boot.test.autoconfigure.orm.jpa.ExampleComponent; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.importedAutoConfiguration; + +/** + * + * @author Michael Simons + */ +@RunWith(SpringRunner.class) +@JooqTest +public class JooqTestIntegrationTests { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Autowired + private DSLContext dsl; + + @Autowired + private DataSource dataSource; + + @Autowired + private ApplicationContext applicationContext; + + @Test + public void testDSLContext() { + assertThat(this.dsl.selectCount().from("INFORMATION_SCHEMA.TABLES").fetchOne(0, Integer.class)).isGreaterThan(0); + } + + @Test + public void replacesDefinedDataSourceWithEmbeddedDefault() throws Exception { + String product = this.dataSource.getConnection().getMetaData() + .getDatabaseProductName(); + assertThat(product).isEqualTo("H2"); + assertThat(this.dsl.configuration().dialect()).isEqualTo(SQLDialect.H2); + } + + @Test + public void didNotInjectExampleComponent() throws Exception { + this.thrown.expect(NoSuchBeanDefinitionException.class); + this.applicationContext.getBean(ExampleComponent.class); + } + + @Test + public void flywayAutoConfigurationWasImported() { + assertThat(this.applicationContext) + .has(importedAutoConfiguration(FlywayAutoConfiguration.class)); + } + + @Test + public void liquibaseAutoConfigurationWasImported() { + assertThat(this.applicationContext) + .has(importedAutoConfiguration(LiquibaseAutoConfiguration.class)); + } +} From d096dcad1ddddfd34a767159f6ec6893ba03753d Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Wed, 31 May 2017 15:07:26 +0200 Subject: [PATCH 2/2] Polish "Add @JooqTest" Closes gh-9343 --- .../main/asciidoc/spring-boot-features.adoc | 26 +++++---- spring-boot-test-autoconfigure/pom.xml | 10 ++-- .../test/autoconfigure/jooq/JooqTest.java | 14 ++--- .../main/resources/META-INF/spring.factories | 10 ++-- .../jooq/JooqTestIntegrationTests.java | 11 ++-- ...ConfigureTestDatabaseIntegrationTests.java | 57 +++++++++++++++++++ 6 files changed, 95 insertions(+), 33 deletions(-) create mode 100644 spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestWithAutoConfigureTestDatabaseIntegrationTests.java diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 03df54bf6a..1e67163738 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -5834,9 +5834,13 @@ A list of the auto-configuration that is enabled by `@JdbcTest` can be [[boot-features-testing-spring-boot-applications-testing-autoconfigured-jooq-test]] ==== Auto-configured jOOQ tests -`@JooqTest` is similar to `@JdbcTest` but for jOOQ related tests. By default it -will configure an in-memory embedded database and a `DSLContext`. Regular -`@Component` beans will not be loaded into the `ApplicationContext`: +`@JooqTest` can be used in a similar fashion as `@JdbcTest` but for jOOQ related tests. As +jOOQ relies heavily on a Java-based schema that corresponds with the database schema, the +existing `DataSource` will be used. If you want to replace it by an in-memory database you +can use `@AutoconfigureTestDatabase` to override those settings. + +`@JooqTest` will configure a `DSLContext`. Regular `@Component` beans will not be loaded +into the `ApplicationContext`: [source,java,indent=0] ---- @@ -5848,19 +5852,17 @@ will configure an in-memory embedded database and a `DSLContext`. Regular @RunWith(SpringRunner.class) @JooqTest - public class ExampleNonTransactionalTests { + public class ExampleJooqTests { + @Autowired - DSLContext create; + private DSLContext dslContext; } ---- -JOOQ tests are also transactional and rollback at the end of each test by default. -If that's not what you want, you can disable transaction management for a test or for -the whole as shown with -<> - -If you prefer your test to run against a real database, you can use the -`@AutoConfigureTestDatabase` annotation the same way as for `JdbcTest` or `DataJpaTest`. +JOOQ tests are transactional and rollback at the end of each test by default. If that's +not what you want, you can disable transaction management for a test or for the whole test +class as <>. A list of the auto-configuration that is enabled by `@JooqTest` can be <>. diff --git a/spring-boot-test-autoconfigure/pom.xml b/spring-boot-test-autoconfigure/pom.xml index d74912ecc2..488b1a1896 100644 --- a/spring-boot-test-autoconfigure/pom.xml +++ b/spring-boot-test-autoconfigure/pom.xml @@ -187,6 +187,11 @@ hsqldb test + + org.jooq + jooq + test + org.mongodb mongodb-driver-async @@ -227,10 +232,5 @@ de.flapdoodle.embed.mongo test - - org.jooq - jooq - test - diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java index 3d0760a2da..8386d4f76a 100644 --- a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/jooq/JooqTest.java @@ -42,14 +42,13 @@ import org.springframework.transaction.annotation.Transactional; * Using this annotation will disable full auto-configuration and instead apply only * configuration relevant to jOOQ tests. *

- * By default, tests annotated with {@code @JooqTest} will use an embedded in-memory - * database (replacing any explicit or usually auto-configured DataSource). Since - * jOOQ relies heavily on a Java-based schema that corresponds with the database schema, - * that is propably not what you want. The - * {@link AutoConfigureTestDatabase @AutoConfigureTestDatabase} annotation can be used - * to override these settings. + * By default, tests annotated with {@code @JooqTest} use the configured database. If + * you want to replace any explicit or usually auto-configured DataSource by an embedded + * in-memory database, the {@link AutoConfigureTestDatabase @AutoConfigureTestDatabase} + * annotation can be used to override these settings. * * @author Michael Simons + * @author Stephane Nicoll * @since 2.0.0 */ @Target(ElementType.TYPE) @@ -61,9 +60,9 @@ import org.springframework.transaction.annotation.Transactional; @TypeExcludeFilters(JooqTypeExcludeFilter.class) @Transactional @AutoConfigureJooq -@AutoConfigureTestDatabase @ImportAutoConfiguration public @interface JooqTest { + /** * Determines if default filtering should be used with * {@link SpringBootApplication @SpringBootApplication}. By default no beans are @@ -94,4 +93,5 @@ public @interface JooqTest { */ @AliasFor(annotation = ImportAutoConfiguration.class, attribute = "exclude") Class[] excludeAutoConfiguration() default {}; + } diff --git a/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories index 21066dbf36..4496301144 100644 --- a/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring.factories @@ -45,6 +45,11 @@ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration +# AutoConfigureTestDatabase auto-configuration imports +org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase=\ +org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration,\ +org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration + # AutoConfigureJooq auto-configuration imports org.springframework.boot.test.autoconfigure.jooq.AutoConfigureJooq=\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ @@ -54,11 +59,6 @@ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration -# AutoConfigureTestDatabase auto-configuration imports -org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase=\ -org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration,\ -org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration - # AutoConfigureJson auto-configuration imports org.springframework.boot.test.autoconfigure.json.AutoConfigureJson=\ org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java index 00e80b8fa4..73d6febfb4 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestIntegrationTests.java @@ -37,6 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.importedAutoConfiguration; /** + * Integration tests for {@link JooqTest}. * * @author Michael Simons */ @@ -58,15 +59,16 @@ public class JooqTestIntegrationTests { @Test public void testDSLContext() { - assertThat(this.dsl.selectCount().from("INFORMATION_SCHEMA.TABLES").fetchOne(0, Integer.class)).isGreaterThan(0); + assertThat(this.dsl.selectCount().from("INFORMATION_SCHEMA.TABLES") + .fetchOne(0, Integer.class)).isGreaterThan(0); } @Test - public void replacesDefinedDataSourceWithEmbeddedDefault() throws Exception { + public void useDefinedDataSource() throws Exception { String product = this.dataSource.getConnection().getMetaData() .getDatabaseProductName(); - assertThat(product).isEqualTo("H2"); - assertThat(this.dsl.configuration().dialect()).isEqualTo(SQLDialect.H2); + assertThat(product).startsWith("HSQL"); + assertThat(this.dsl.configuration().dialect()).isEqualTo(SQLDialect.HSQLDB); } @Test @@ -86,4 +88,5 @@ public class JooqTestIntegrationTests { assertThat(this.applicationContext) .has(importedAutoConfiguration(LiquibaseAutoConfiguration.class)); } + } diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestWithAutoConfigureTestDatabaseIntegrationTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestWithAutoConfigureTestDatabaseIntegrationTests.java new file mode 100644 index 0000000000..4babbca026 --- /dev/null +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/jooq/JooqTestWithAutoConfigureTestDatabaseIntegrationTests.java @@ -0,0 +1,57 @@ +/* + * Copyright 2012-2017 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.autoconfigure.jooq; + +import javax.sql.DataSource; + +import org.jooq.DSLContext; +import org.jooq.SQLDialect; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link JooqTest}. + * + * @author Stephane Nicoll + */ +@RunWith(SpringRunner.class) +@JooqTest +@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2) +public class JooqTestWithAutoConfigureTestDatabaseIntegrationTests { + + @Autowired + private DSLContext dsl; + + @Autowired + private DataSource dataSource; + + @Test + public void replacesAutoConfiguredDataSource() throws Exception { + String product = this.dataSource.getConnection().getMetaData() + .getDatabaseProductName(); + assertThat(product).startsWith("H2"); + assertThat(this.dsl.configuration().dialect()).isEqualTo(SQLDialect.H2); + } + +}