From 865f1f692a8bbac4f6ea3d1600ca1924c08c654a Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sat, 10 Nov 2018 15:47:04 +0100 Subject: [PATCH] Introduce tests for @Sql and @Transactional support in @Nested test classes This commit was inspired by the following question on Stack Overflow. https://stackoverflow.com/questions/53236807/spring-boot-testing-run-script-in-a-nested-test-sql-script-sql --- .../jdbc/PopulatedSchemaDatabaseConfig.java | 8 +- ...stsWithSqlScriptsAndJUnitJupiterTests.java | 95 +++++++++++++++++++ 2 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 spring-test/src/test/java/org/springframework/test/context/junit/jupiter/nested/NestedTestsWithSqlScriptsAndJUnitJupiterTests.java diff --git a/spring-test/src/test/java/org/springframework/test/context/jdbc/PopulatedSchemaDatabaseConfig.java b/spring-test/src/test/java/org/springframework/test/context/jdbc/PopulatedSchemaDatabaseConfig.java index 43096bfd66..16e90b88c7 100644 --- a/spring-test/src/test/java/org/springframework/test/context/jdbc/PopulatedSchemaDatabaseConfig.java +++ b/spring-test/src/test/java/org/springframework/test/context/jdbc/PopulatedSchemaDatabaseConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2018 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. @@ -20,6 +20,7 @@ import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.transaction.PlatformTransactionManager; @@ -47,4 +48,9 @@ public class PopulatedSchemaDatabaseConfig { .build(); } + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } + } diff --git a/spring-test/src/test/java/org/springframework/test/context/junit/jupiter/nested/NestedTestsWithSqlScriptsAndJUnitJupiterTests.java b/spring-test/src/test/java/org/springframework/test/context/junit/jupiter/nested/NestedTestsWithSqlScriptsAndJUnitJupiterTests.java new file mode 100644 index 0000000000..c1fb4ef1d6 --- /dev/null +++ b/spring-test/src/test/java/org/springframework/test/context/junit/jupiter/nested/NestedTestsWithSqlScriptsAndJUnitJupiterTests.java @@ -0,0 +1,95 @@ +/* + * Copyright 2002-2018 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.test.context.junit.jupiter.nested; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.jdbc.PopulatedSchemaDatabaseConfig; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; +import org.springframework.test.context.transaction.AfterTransaction; +import org.springframework.test.context.transaction.BeforeTransaction; +import org.springframework.test.jdbc.JdbcTestUtils; +import org.springframework.transaction.annotation.Transactional; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Integration tests that verify support for {@link Nested @Nested} test classes in + * conjunction with the {@link SpringExtension}, {@link Sql @Sql}, and + * {@link Transactional @Transactional} in a JUnit Jupiter environment. + * + * @author Sam Brannen + * @since 5.1.2 + */ +@SpringJUnitConfig(PopulatedSchemaDatabaseConfig.class) +@Transactional +@TestInstance(Lifecycle.PER_CLASS) +class NestedTestsWithSqlScriptsAndJUnitJupiterTests { + + @Autowired + JdbcTemplate jdbcTemplate; + + @BeforeTransaction + @AfterTransaction + void checkInitialDatabaseState() { + assertEquals(0, countRowsInTable("user")); + } + + @Test + @Sql("/org/springframework/test/context/jdbc/data.sql") + void sqlScripts() { + assertEquals(1, countRowsInTable("user")); + } + + private int countRowsInTable(String tableName) { + return JdbcTestUtils.countRowsInTable(this.jdbcTemplate, tableName); + } + + @Nested + @SpringJUnitConfig(PopulatedSchemaDatabaseConfig.class) + @Transactional + class NestedTests { + + @Autowired + JdbcTemplate jdbcTemplate; + + @BeforeTransaction + @AfterTransaction + void checkInitialDatabaseState() { + assertEquals(0, countRowsInTable("user")); + } + + @Test + @Sql("/org/springframework/test/context/jdbc/data.sql") + void nestedSqlScripts() { + assertEquals(1, countRowsInTable("user")); + } + + private int countRowsInTable(String tableName) { + return JdbcTestUtils.countRowsInTable(this.jdbcTemplate, tableName); + } + + } + +}