Skip to content

Commit 1c668eb

Browse files
committed
testContainer:
add InitTestContainerDB for initialize database as testContainer for test.
1 parent a3d36fd commit 1c668eb

6 files changed

Lines changed: 83 additions & 10 deletions

File tree

pom.xml

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111
<groupId>ir.bigz</groupId>
1212
<artifactId>springboot-real</artifactId>
13-
<version>1.0.0</version>
13+
<version>1.1.0</version>
1414
<name>basicFeaturesForSpringProject</name>
1515
<description>Demo project for use Spring Boot in project</description>
1616

@@ -157,7 +157,12 @@
157157
<dependency>
158158
<groupId>org.testcontainers</groupId>
159159
<artifactId>postgresql</artifactId>
160-
<version>1.16.0</version>
160+
<scope>test</scope>
161+
</dependency>
162+
163+
<dependency>
164+
<groupId>org.testcontainers</groupId>
165+
<artifactId>spock</artifactId>
161166
<scope>test</scope>
162167
</dependency>
163168

@@ -187,6 +192,18 @@
187192
</dependency>
188193
</dependencies>
189194

195+
<dependencyManagement>
196+
<dependencies>
197+
<dependency>
198+
<groupId>org.testcontainers</groupId>
199+
<artifactId>testcontainers-bom</artifactId>
200+
<version>1.16.0</version>
201+
<type>pom</type>
202+
<scope>import</scope>
203+
</dependency>
204+
</dependencies>
205+
</dependencyManagement>
206+
190207
<build>
191208
<plugins>
192209
<plugin>

src/main/java/ir/bigz/springbootreal/configuration/DataSourceConfiguration.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
55
import org.springframework.boot.context.properties.ConfigurationProperties;
66
import org.springframework.boot.jdbc.DataSourceBuilder;
7-
import org.springframework.cache.annotation.EnableCaching;
87
import org.springframework.context.annotation.Bean;
98
import org.springframework.context.annotation.Configuration;
109
import org.springframework.core.env.Environment;
1110
import org.springframework.orm.jpa.JpaTransactionManager;
1211
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
1312
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
1413
import org.springframework.transaction.PlatformTransactionManager;
15-
import org.springframework.transaction.TransactionManager;
1614

17-
import javax.persistence.EntityManager;
1815
import javax.persistence.EntityManagerFactory;
1916
import javax.sql.DataSource;
2017
import java.util.Properties;
@@ -25,7 +22,6 @@ public class DataSourceConfiguration {
2522
@Autowired
2623
private Environment env;
2724

28-
2925
@Bean
3026
@ConfigurationProperties(prefix = "demo.datasource")
3127
public DataSourceProperties dataSourceProperties(){
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package ir.bigz.springbootreal.web
2+
3+
import ir.bigz.springbootreal.configuration.DataSourceConfiguration
4+
5+
import ir.bigz.springbootreal.configuration.WebConfiguration
6+
import ir.bigz.springbootreal.dal.UserRepositoryImpl
7+
import ir.bigz.springbootreal.dao.User
8+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration
9+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
10+
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
11+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
12+
import org.springframework.boot.test.context.SpringBootTest
13+
import org.springframework.context.ApplicationContextInitializer
14+
import org.springframework.context.ConfigurableApplicationContext
15+
import org.springframework.core.io.DefaultResourceLoader
16+
import org.springframework.core.io.Resource
17+
import org.springframework.core.io.ResourceLoader
18+
import org.springframework.test.context.ContextConfiguration
19+
import org.springframework.transaction.annotation.EnableTransactionManagement
20+
import org.testcontainers.containers.PostgreSQLContainer
21+
import org.testcontainers.spock.Testcontainers
22+
import org.testcontainers.utility.DockerImageName
23+
import spock.lang.Specification
24+
25+
@Testcontainers
26+
@ContextConfiguration(classes = [UserRepositoryImpl.class, User.class,
27+
DataSourceConfiguration.class, WebConfiguration.class], initializers = InitTestContainerDB.class)
28+
@SpringBootTest(properties = "spring.profiles.active:test")
29+
@EnableAutoConfiguration(exclude = [DataSourceAutoConfiguration.class,
30+
HibernateJpaAutoConfiguration.class,
31+
DataSourceTransactionManagerAutoConfiguration.class])
32+
@EnableTransactionManagement
33+
class InitTestContainerDB extends Specification implements ApplicationContextInitializer<ConfigurableApplicationContext>{
34+
35+
static PostgreSQLContainer postgreSQLContainer
36+
37+
@Override
38+
void initialize(ConfigurableApplicationContext configurableApplicationContext) {
39+
40+
final Properties properties = new Properties()
41+
try {
42+
ResourceLoader resourceLoader = new DefaultResourceLoader()
43+
String resolvedLocation = configurableApplicationContext.environment.resolveRequiredPlaceholders("classpath:application-test.properties");
44+
Resource resource = resourceLoader.getResource(resolvedLocation)
45+
properties.load(new FileInputStream(resource.file))
46+
}
47+
catch (IllegalArgumentException | FileNotFoundException | UnknownHostException | SocketException ex) {
48+
throw ex
49+
}
50+
51+
DockerImageName myImage = DockerImageName.parse((String)properties.getProperty("demo.datasource.dockerImageName")).
52+
asCompatibleSubstituteFor("postgres")
53+
postgreSQLContainer = new PostgreSQLContainer<>(myImage)
54+
.withExposedPorts(Integer.parseInt(properties.getProperty("demo.datasource.imagePort")))
55+
.withPassword((String)properties.getProperty("demo.datasource.password"))
56+
.withDatabaseName((String)properties.getProperty("demo.datasource.dbName"))
57+
postgreSQLContainer.start()
58+
}
59+
}

src/test/groovy/ir/bigz/springbootreal/web/RepositoryTest.groovy

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat
1313
import org.springframework.boot.test.context.SpringBootTest
1414
import org.springframework.test.context.ContextConfiguration
1515
import org.springframework.transaction.annotation.EnableTransactionManagement
16-
import spock.lang.Specification
1716
import spock.lang.Title
1817

1918
import java.sql.Timestamp
@@ -27,7 +26,7 @@ import java.time.LocalDateTime
2726
HibernateJpaAutoConfiguration.class,
2827
DataSourceTransactionManagerAutoConfiguration.class])
2928
@EnableTransactionManagement
30-
class RepositoryTest extends Specification{
29+
class RepositoryTest extends InitTestContainerDB {
3130

3231
@Autowired
3332
private UserRepository userRepository

src/test/groovy/ir/bigz/springbootreal/web/ServiceTest.groovy

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat
1818
import org.springframework.boot.test.context.SpringBootTest
1919
import org.springframework.test.context.ContextConfiguration
2020
import org.springframework.transaction.annotation.EnableTransactionManagement
21-
import spock.lang.Specification
2221
import spock.lang.Title
2322

2423
@ContextConfiguration(classes = [UserRepositoryImpl.class, User.class,
@@ -29,7 +28,7 @@ import spock.lang.Title
2928
HibernateJpaAutoConfiguration.class,
3029
DataSourceTransactionManagerAutoConfiguration.class])
3130
@EnableTransactionManagement
32-
class ServiceTest extends Specification{
31+
class ServiceTest extends InitTestContainerDB {
3332

3433
@Autowired
3534
private UserRepository userRepository

src/test/resources/application-test.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
server.port=9090
33

44
################### TestContainers DATABASE CONFIGURATION ###################
5+
demo.datasource.dockerImageName=postgres:latest
6+
demo.datasource.imagePort=5432
7+
demo.datasource.dbName=sp_test
58
demo.datasource.url=jdbc:tc:postgresql:latest://localhost/myapp
69
demo.datasource.username=user
710
demo.datasource.password=password

0 commit comments

Comments
 (0)