Skip to content

Commit a7bbd12

Browse files
committed
Polishing.
Refactor Testcontainers config infrastructure. See #2381
1 parent b4b41eb commit a7bbd12

File tree

4 files changed

+118
-182
lines changed

4 files changed

+118
-182
lines changed

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/procedures/MySqlStoredProcedureIntegrationTests.java

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,17 @@
1919
import static org.assertj.core.api.Assertions.*;
2020

2121
import jakarta.persistence.Entity;
22-
import jakarta.persistence.EntityManagerFactory;
2322
import jakarta.persistence.GeneratedValue;
2423
import jakarta.persistence.Id;
2524
import jakarta.persistence.NamedStoredProcedureQuery;
2625

2726
import java.util.List;
2827
import java.util.Objects;
29-
import java.util.Properties;
30-
31-
import javax.sql.DataSource;
3228

3329
import org.hibernate.dialect.MySQLDialect;
3430
import org.junit.jupiter.api.Test;
3531
import org.junit.jupiter.api.extension.ExtendWith;
32+
3633
import org.springframework.beans.factory.annotation.Autowired;
3734
import org.springframework.context.annotation.Bean;
3835
import org.springframework.context.annotation.ComponentScan.Filter;
@@ -41,20 +38,12 @@
4138
import org.springframework.data.jpa.repository.JpaRepository;
4239
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
4340
import org.springframework.data.jpa.repository.query.Procedure;
44-
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
45-
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
46-
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
47-
import org.springframework.orm.jpa.JpaTransactionManager;
48-
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
49-
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
5041
import org.springframework.test.context.ContextConfiguration;
5142
import org.springframework.test.context.junit.jupiter.SpringExtension;
52-
import org.springframework.transaction.PlatformTransactionManager;
5343
import org.springframework.transaction.annotation.EnableTransactionManagement;
5444
import org.springframework.transaction.annotation.Transactional;
55-
import org.testcontainers.containers.MySQLContainer;
5645

57-
import com.mysql.cj.jdbc.MysqlDataSource;
46+
import org.testcontainers.containers.MySQLContainer;
5847

5948
/**
6049
* Testcase to verify {@link org.springframework.jdbc.object.StoredProcedure}s work with MySQL.
@@ -234,7 +223,11 @@ public interface EmployeeRepositoryWithNoCursor extends JpaRepository<Employee,
234223
basePackageClasses = Config.class, //
235224
includeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = EmployeeRepositoryWithNoCursor.class))
236225
@EnableTransactionManagement
237-
static class Config {
226+
static class Config extends StoredProcedureConfigSupport {
227+
228+
public Config() {
229+
super(MySQLDialect.class, new ClassPathResource("scripts/mysql-stored-procedures.sql"));
230+
}
238231

239232
@SuppressWarnings("resource")
240233
@Bean(initMethod = "start", destroyMethod = "stop")
@@ -245,51 +238,5 @@ public MySQLContainer<?> container() {
245238
.withPassword("test") //
246239
.withConfigurationOverride("");
247240
}
248-
249-
@Bean
250-
public DataSource dataSource(MySQLContainer<?> container) {
251-
252-
MysqlDataSource dataSource = new MysqlDataSource();
253-
dataSource.setUrl(container.getJdbcUrl());
254-
dataSource.setUser(container.getUsername());
255-
dataSource.setPassword(container.getPassword());
256-
return dataSource;
257-
}
258-
259-
@Bean
260-
public AbstractEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
261-
262-
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
263-
factoryBean.setDataSource(dataSource);
264-
factoryBean.setPersistenceUnitRootLocation("simple-persistence");
265-
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
266-
factoryBean.setPackagesToScan(this.getClass().getPackage().getName());
267-
268-
Properties properties = new Properties();
269-
properties.setProperty("hibernate.hbm2ddl.auto", "create");
270-
properties.setProperty("hibernate.dialect", MySQLDialect.class.getCanonicalName());
271-
factoryBean.setJpaProperties(properties);
272-
273-
return factoryBean;
274-
}
275-
276-
@Bean
277-
PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
278-
return new JpaTransactionManager(entityManagerFactory);
279-
}
280-
281-
@Bean
282-
DataSourceInitializer initializer(DataSource dataSource) {
283-
284-
DataSourceInitializer initializer = new DataSourceInitializer();
285-
initializer.setDataSource(dataSource);
286-
287-
ClassPathResource script = new ClassPathResource("scripts/mysql-stored-procedures.sql");
288-
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(script);
289-
populator.setSeparator(";;");
290-
initializer.setDatabasePopulator(populator);
291-
292-
return initializer;
293-
}
294241
}
295242
}

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/procedures/PostgresStoredProcedureIntegrationTests.java

Lines changed: 5 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import static org.assertj.core.api.Assertions.*;
2020

2121
import jakarta.persistence.Entity;
22-
import jakarta.persistence.EntityManagerFactory;
2322
import jakarta.persistence.GeneratedValue;
2423
import jakarta.persistence.Id;
2524
import jakarta.persistence.NamedStoredProcedureQuery;
@@ -30,14 +29,10 @@
3029
import java.util.List;
3130
import java.util.Map;
3231
import java.util.Objects;
33-
import java.util.Properties;
34-
35-
import javax.sql.DataSource;
3632

3733
import org.hibernate.dialect.PostgreSQLDialect;
3834
import org.junit.jupiter.api.Test;
3935
import org.junit.jupiter.api.extension.ExtendWith;
40-
import org.postgresql.ds.PGSimpleDataSource;
4136

4237
import org.springframework.beans.factory.annotation.Autowired;
4338
import org.springframework.context.annotation.Bean;
@@ -48,15 +43,8 @@
4843
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
4944
import org.springframework.data.jpa.repository.query.Procedure;
5045
import org.springframework.data.jpa.util.DisabledOnHibernate62;
51-
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
52-
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
53-
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
54-
import org.springframework.orm.jpa.JpaTransactionManager;
55-
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
56-
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
5746
import org.springframework.test.context.ContextConfiguration;
5847
import org.springframework.test.context.junit.jupiter.SpringExtension;
59-
import org.springframework.transaction.PlatformTransactionManager;
6048
import org.springframework.transaction.annotation.EnableTransactionManagement;
6149
import org.springframework.transaction.annotation.Transactional;
6250

@@ -265,7 +253,11 @@ public interface EmployeeRepositoryWithRefCursor extends JpaRepository<Employee,
265253
@EnableJpaRepositories(considerNestedRepositories = true,
266254
includeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = EmployeeRepositoryWithRefCursor.class))
267255
@EnableTransactionManagement
268-
static class Config {
256+
static class Config extends StoredProcedureConfigSupport {
257+
258+
public Config() {
259+
super(PostgreSQLDialect.class, new ClassPathResource("scripts/postgres-stored-procedures.sql"));
260+
}
269261

270262
@SuppressWarnings("resource")
271263
@Bean(initMethod = "start", destroyMethod = "stop")
@@ -274,51 +266,5 @@ public PostgreSQLContainer<?> container() {
274266
return new PostgreSQLContainer<>("postgres:15.3") //
275267
.withUsername("postgres");
276268
}
277-
278-
@Bean
279-
public DataSource dataSource(PostgreSQLContainer<?> container) {
280-
281-
PGSimpleDataSource dataSource = new PGSimpleDataSource();
282-
dataSource.setUrl(container.getJdbcUrl());
283-
dataSource.setUser(container.getUsername());
284-
dataSource.setPassword(container.getPassword());
285-
return dataSource;
286-
}
287-
288-
@Bean
289-
public AbstractEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
290-
291-
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
292-
factoryBean.setDataSource(dataSource);
293-
factoryBean.setPersistenceUnitRootLocation("simple-persistence");
294-
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
295-
factoryBean.setPackagesToScan(this.getClass().getPackage().getName());
296-
297-
Properties properties = new Properties();
298-
properties.setProperty("hibernate.hbm2ddl.auto", "create");
299-
properties.setProperty("hibernate.dialect", PostgreSQLDialect.class.getCanonicalName());
300-
factoryBean.setJpaProperties(properties);
301-
302-
return factoryBean;
303-
}
304-
305-
@Bean
306-
PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
307-
return new JpaTransactionManager(entityManagerFactory);
308-
}
309-
310-
@Bean
311-
DataSourceInitializer initializer(DataSource dataSource) {
312-
313-
DataSourceInitializer initializer = new DataSourceInitializer();
314-
initializer.setDataSource(dataSource);
315-
316-
ClassPathResource script = new ClassPathResource("scripts/postgres-stored-procedures.sql");
317-
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(script);
318-
populator.setSeparator(";;");
319-
initializer.setDatabasePopulator(populator);
320-
321-
return initializer;
322-
}
323269
}
324270
}

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/procedures/PostgresStoredProcedureNullHandlingIntegrationTests.java

Lines changed: 8 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,17 @@
1616
package org.springframework.data.jpa.repository.procedures;
1717

1818
import jakarta.persistence.Entity;
19-
import jakarta.persistence.EntityManagerFactory;
2019
import jakarta.persistence.GeneratedValue;
2120
import jakarta.persistence.GenerationType;
2221
import jakarta.persistence.Id;
2322

2423
import java.util.Date;
25-
import java.util.Properties;
2624
import java.util.UUID;
2725

28-
import javax.sql.DataSource;
29-
3026
import org.hibernate.dialect.PostgreSQLDialect;
3127
import org.junit.jupiter.api.Test;
3228
import org.junit.jupiter.api.extension.ExtendWith;
33-
import org.postgresql.ds.PGSimpleDataSource;
29+
3430
import org.springframework.beans.factory.annotation.Autowired;
3531
import org.springframework.context.annotation.Bean;
3632
import org.springframework.context.annotation.ComponentScan;
@@ -41,17 +37,11 @@
4137
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
4238
import org.springframework.data.jpa.repository.query.Procedure;
4339
import org.springframework.data.jpa.util.DisabledOnHibernate61;
44-
import org.springframework.jdbc.datasource.init.DataSourceInitializer;
45-
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
46-
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
47-
import org.springframework.orm.jpa.JpaTransactionManager;
48-
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
49-
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
5040
import org.springframework.test.context.ContextConfiguration;
5141
import org.springframework.test.context.junit.jupiter.SpringExtension;
52-
import org.springframework.transaction.PlatformTransactionManager;
5342
import org.springframework.transaction.annotation.EnableTransactionManagement;
5443
import org.springframework.transaction.annotation.Transactional;
44+
5545
import org.testcontainers.containers.PostgreSQLContainer;
5646

5747
/**
@@ -138,63 +128,18 @@ public interface TestModelRepository extends JpaRepository<TestModel, Long> {
138128
@EnableJpaRepositories(considerNestedRepositories = true,
139129
includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = TestModelRepository.class))
140130
@EnableTransactionManagement
141-
static class Config {
131+
static class Config extends StoredProcedureConfigSupport {
142132

133+
public Config() {
134+
super(PostgreSQLDialect.class, new ClassPathResource("scripts/postgres-nullable-stored-procedures.sql"));
135+
}
136+
137+
@SuppressWarnings("resource")
143138
@Bean(initMethod = "start", destroyMethod = "stop")
144139
public PostgreSQLContainer<?> container() {
145140

146141
return new PostgreSQLContainer<>("postgres:15.3") //
147142
.withUsername("postgres");
148143
}
149-
150-
@Bean
151-
public DataSource dataSource(PostgreSQLContainer<?> container) {
152-
153-
PGSimpleDataSource dataSource = new PGSimpleDataSource();
154-
dataSource.setUrl(container.getJdbcUrl());
155-
dataSource.setUser(container.getUsername());
156-
dataSource.setPassword(container.getPassword());
157-
158-
return dataSource;
159-
}
160-
161-
@Bean
162-
public AbstractEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
163-
164-
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
165-
factoryBean.setDataSource(dataSource);
166-
factoryBean.setPersistenceUnitRootLocation("simple-persistence");
167-
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
168-
factoryBean.setPackagesToScan(this.getClass().getPackage().getName());
169-
170-
Properties properties = new Properties();
171-
properties.setProperty("hibernate.hbm2ddl.auto", "create");
172-
properties.setProperty("hibernate.dialect", PostgreSQLDialect.class.getCanonicalName());
173-
properties.setProperty("hibernate.proc.param_null_passing", "true");
174-
properties.setProperty("hibernate.globally_quoted_identifiers", "true");
175-
properties.setProperty("hibernate.globally_quoted_identifiers_skip_column_definitions", "true");
176-
factoryBean.setJpaProperties(properties);
177-
178-
return factoryBean;
179-
}
180-
181-
@Bean
182-
PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
183-
return new JpaTransactionManager(entityManagerFactory);
184-
}
185-
186-
@Bean
187-
DataSourceInitializer initializer(DataSource dataSource) {
188-
189-
DataSourceInitializer initializer = new DataSourceInitializer();
190-
initializer.setDataSource(dataSource);
191-
192-
ClassPathResource script = new ClassPathResource("scripts/postgres-nullable-stored-procedures.sql");
193-
ResourceDatabasePopulator populator = new ResourceDatabasePopulator(script);
194-
populator.setSeparator(";;");
195-
initializer.setDatabasePopulator(populator);
196-
197-
return initializer;
198-
}
199144
}
200145
}

0 commit comments

Comments
 (0)