Skip to content

Commit 99d2d24

Browse files
authored
Merge pull request #2 from YAPP-Github/test/setting
[Test] 각 레이어 별 테스트 환경 세팅
2 parents 08b1f32 + 80e85c1 commit 99d2d24

File tree

7 files changed

+131
-3
lines changed

7 files changed

+131
-3
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ dependencies {
4343
runtimeOnly 'com.mysql:mysql-connector-j'
4444

4545
// Test
46-
testImplementation 'org.springframework.boot:spring-boot-starter-test'
47-
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
4846
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
47+
testImplementation 'org.springframework.boot:spring-boot-starter-test'
48+
testImplementation 'io.rest-assured:rest-assured:5.5.0'
4949
}
5050

5151
tasks.named('test', Test) {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package baegam.sundae;
2+
3+
import jakarta.persistence.EntityManager;
4+
import java.util.List;
5+
import org.junit.jupiter.api.extension.BeforeEachCallback;
6+
import org.junit.jupiter.api.extension.ExtensionContext;
7+
import org.springframework.context.ApplicationContext;
8+
import org.springframework.test.context.junit.jupiter.SpringExtension;
9+
import org.springframework.transaction.support.TransactionTemplate;
10+
11+
public class DatabaseCleaner implements BeforeEachCallback {
12+
13+
@Override
14+
public void beforeEach(ExtensionContext extensionContext) {
15+
ApplicationContext context = SpringExtension.getApplicationContext(extensionContext);
16+
cleanup(context);
17+
}
18+
19+
private void cleanup(ApplicationContext context) {
20+
EntityManager em = context.getBean(EntityManager.class);
21+
TransactionTemplate transactionTemplate = context.getBean(TransactionTemplate.class);
22+
23+
transactionTemplate.execute(action -> {
24+
em.clear();
25+
truncateTables(em);
26+
return null;
27+
});
28+
}
29+
30+
private void truncateTables(EntityManager em) {
31+
em.createNativeQuery("SET REFERENTIAL_INTEGRITY FALSE").executeUpdate();
32+
for (String tableName : findTableNames(em)) {
33+
em.createNativeQuery("TRUNCATE TABLE %s RESTART IDENTITY".formatted(tableName)).executeUpdate();
34+
}
35+
em.createNativeQuery("SET REFERENTIAL_INTEGRITY TRUE").executeUpdate();
36+
}
37+
38+
@SuppressWarnings("unchecked")
39+
private List<String> findTableNames(EntityManager em) {
40+
String tableNameSelectQuery = """
41+
SELECT TABLE_NAME
42+
FROM INFORMATION_SCHEMA.TABLES
43+
WHERE TABLE_SCHEMA = 'PUBLIC'
44+
""";
45+
return em.createNativeQuery(tableNameSelectQuery).getResultList();
46+
}
47+
}

src/test/java/baegam/sundae/SundaeApplicationTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,4 @@ class SundaeApplicationTests {
99
@Test
1010
void contextLoads() {
1111
}
12-
1312
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package baegam.sundae.controller;
2+
3+
import baegam.sundae.DatabaseCleaner;
4+
import io.restassured.RestAssured;
5+
import io.restassured.builder.RequestSpecBuilder;
6+
import io.restassured.filter.Filter;
7+
import io.restassured.filter.log.RequestLoggingFilter;
8+
import io.restassured.filter.log.ResponseLoggingFilter;
9+
import io.restassured.specification.RequestSpecification;
10+
import java.util.List;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.extension.ExtendWith;
13+
import org.springframework.boot.test.context.SpringBootTest;
14+
import org.springframework.boot.test.web.server.LocalServerPort;
15+
16+
@ExtendWith(DatabaseCleaner.class)
17+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
18+
public class BaseControllerTest {
19+
20+
private static final List<Filter> SPEC_FILTERS = List.of(new RequestLoggingFilter(), new ResponseLoggingFilter());
21+
22+
@LocalServerPort
23+
private int port;
24+
25+
private RequestSpecification spec;
26+
27+
@BeforeEach
28+
void setEnvironment() {
29+
RestAssured.port = port;
30+
spec = new RequestSpecBuilder()
31+
.addFilters(SPEC_FILTERS)
32+
.build();
33+
}
34+
35+
protected final RequestSpecification given() {
36+
return RestAssured.given(spec);
37+
}
38+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package baegam.sundae.repository;
2+
3+
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
4+
5+
@DataJpaTest
6+
public abstract class BaseRepositoryTest {
7+
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package baegam.sundae.service;
2+
3+
import baegam.sundae.DatabaseCleaner;
4+
import org.junit.jupiter.api.extension.ExtendWith;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
7+
@ExtendWith(DatabaseCleaner.class)
8+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
9+
public abstract class BaseServiceTest {
10+
11+
}

src/test/resources/application.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
spring:
2+
profiles:
3+
active: test
4+
5+
---
6+
7+
spring:
8+
config:
9+
activate:
10+
on-profile: test
11+
datasource:
12+
driver-class-name: org.h2.Driver
13+
url: jdbc:h2:mem:database
14+
username: sa
15+
password:
16+
jpa:
17+
show-sql: true
18+
properties:
19+
hibernate:
20+
format_sql: true
21+
hibernate:
22+
ddl-auto: create-drop
23+
defer-datasource-initialization: true
24+
flyway:
25+
enabled: false

0 commit comments

Comments
 (0)