Skip to content

Commit c98427f

Browse files
committed
Add integration tests and refactor test utility setup
Introduced MemberRestControllerIntegrationTest to cover API workflows. Refactored common test utilities by adding TagUtils for test tag handling and AbstractIntegrationTest for shared integration test configuration. Updated build configuration to include Lombok for cleaner code.
1 parent a1852cb commit c98427f

File tree

7 files changed

+132
-9
lines changed

7 files changed

+132
-9
lines changed

spring-boot/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ dependencies {
3737

3838
testImplementation 'org.springframework.boot:spring-boot-starter-test'
3939
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
40+
testImplementation 'org.projectlombok:lombok'
41+
testAnnotationProcessor 'org.projectlombok:lombok'
4042
}
4143

4244
tasks.named('test') {

spring-boot/src/test/java/com/mpc/springboot/member/infrastructure/persistence/jpa/repository/MemberRepositoryTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.mpc.springboot.member.domain.vo.MemberCode;
99
import com.mpc.springboot.member.domain.vo.MemberName;
1010
import com.mpc.springboot.shared.AbstractRepositoryTest;
11+
import com.mpc.springboot.shared.type.TestTag;
1112
import org.junit.jupiter.api.*;
1213

1314
import static org.junit.jupiter.api.Assertions.*;
@@ -28,7 +29,7 @@ protected void setUp() {
2829
}
2930

3031
@DisplayName("멤버 저장 테스트")
31-
@Tag(NO_SETUP)
32+
@Tag(TestTag.NO_SETUP)
3233
@Test
3334
void save() {
3435
// given
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.mpc.springboot.member.presentation.controller;
2+
3+
import com.mpc.springboot.member.domain.entity.Member;
4+
import com.mpc.springboot.member.domain.repository.MemberRepository;
5+
import com.mpc.springboot.member.domain.vo.MemberCode;
6+
import com.mpc.springboot.member.domain.vo.MemberName;
7+
import com.mpc.springboot.shared.AbstractIntegrationTest;
8+
import com.mpc.springboot.shared.type.TestTag;
9+
import org.junit.jupiter.api.*;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.http.MediaType;
12+
13+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
14+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
15+
16+
17+
class MemberRestControllerIntegrationTest extends AbstractIntegrationTest {
18+
19+
private Member savedMember;
20+
21+
@Autowired
22+
private MemberRepository memberRepository;
23+
24+
@Override
25+
protected void setUp() {
26+
// given
27+
MemberCode code = MemberCode.of("T0000001");
28+
MemberName name = MemberName.of("Alice", "Smith");
29+
savedMember = memberRepository.save(Member.of(code, name));
30+
}
31+
32+
@DisplayName("멤버 생성 API 통합 테스트")
33+
@Tag(TestTag.NO_SETUP)
34+
@Test
35+
void createMember() throws Exception {
36+
// given
37+
MemberCode code = MemberCode.of("T0000001");
38+
MemberName name = MemberName.of("Alice", "Smith");
39+
Member member = Member.of(code, name);
40+
41+
// when & then
42+
mockMvc.perform(post("/api/v1/members")
43+
.contentType(MediaType.APPLICATION_JSON)
44+
.content(objectMapper.writeValueAsString(member)))
45+
.andExpect(status().isOk());
46+
}
47+
48+
49+
50+
@DisplayName("멤버 조회 API 통합 테스트")
51+
@Test
52+
void getMemberBy() throws Exception {
53+
// given
54+
MemberCode code = savedMember.getCode();
55+
MemberName name = savedMember.getName();
56+
57+
// when & then
58+
mockMvc.perform(get("/api/v1/members/{code}", code.getValue()))
59+
.andExpect(status().isOk())
60+
.andExpect(jsonPath("$.code.value").value(code.getValue()))
61+
.andExpect(jsonPath("$.name.firstName").value(name.getFirstName()))
62+
.andExpect(jsonPath("$.name.lastName").value(name.getLastName()))
63+
.andExpect(jsonPath("$.name.fullName").value(name.getFullName()));
64+
}
65+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.mpc.springboot.shared;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.springframework.test.web.servlet.MockMvc;
7+
import org.springframework.transaction.annotation.Transactional;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.mpc.springboot.Application;
10+
import com.mpc.springboot.shared.utils.TagUtils;
11+
import org.junit.jupiter.api.*;
12+
13+
14+
@SpringBootTest(classes = Application.class)
15+
@AutoConfigureMockMvc
16+
@Transactional
17+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
18+
public abstract class AbstractIntegrationTest {
19+
20+
@Autowired
21+
protected MockMvc mockMvc;
22+
23+
@Autowired
24+
protected ObjectMapper objectMapper;
25+
26+
27+
@BeforeEach
28+
void commonSetUp(TestInfo testInfo) {
29+
if (TagUtils.hasNoSetupTag(testInfo)) {
30+
return;
31+
}
32+
setUp();
33+
}
34+
35+
protected abstract void setUp();
36+
}

spring-boot/src/test/java/com/mpc/springboot/shared/AbstractRepositoryTest.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,21 @@
33
import jakarta.transaction.Transactional;
44

55
import org.springframework.boot.test.context.SpringBootTest;
6+
import com.mpc.springboot.shared.utils.TagUtils;
67
import org.junit.jupiter.api.*;
78

89
@SpringBootTest
910
@Transactional
1011
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
1112
public abstract class AbstractRepositoryTest {
1213

13-
protected static final String NO_SETUP = "NoSetup";
14-
1514
@BeforeEach
1615
void commonSetUp(TestInfo testInfo) {
17-
if (hasNoSetupTag(testInfo)) {
16+
if (TagUtils.hasNoSetupTag(testInfo)) {
1817
return;
1918
}
2019
setUp();
2120
}
2221

23-
private static boolean hasNoSetupTag(TestInfo testInfo) {
24-
return testInfo.getTags()
25-
.contains(NO_SETUP);
26-
}
27-
2822
protected abstract void setUp();
2923
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.mpc.springboot.shared.type;
2+
3+
import lombok.Getter;
4+
5+
6+
public class TestTag {
7+
8+
public static final String NO_SETUP = "no-setup";
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.mpc.springboot.shared.utils;
2+
3+
import com.mpc.springboot.shared.type.TestTag;
4+
import org.junit.jupiter.api.TestInfo;
5+
6+
public class TagUtils {
7+
8+
private TagUtils() {
9+
// Utility class
10+
}
11+
12+
public static boolean hasNoSetupTag(TestInfo testInfo) {
13+
return testInfo.getTags()
14+
.contains(TestTag.NO_SETUP);
15+
}
16+
}

0 commit comments

Comments
 (0)