From c98427f05f12e0d1be996d334d9089283e13dfef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A4=80=ED=97=8C?= Date: Fri, 28 Feb 2025 18:45:12 +0900 Subject: [PATCH 1/2] 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. --- spring-boot/build.gradle | 2 + .../jpa/repository/MemberRepositoryTest.java | 3 +- .../MemberRestControllerIntegrationTest.java | 65 +++++++++++++++++++ .../shared/AbstractIntegrationTest.java | 36 ++++++++++ .../shared/AbstractRepositoryTest.java | 10 +-- .../mpc/springboot/shared/type/TestTag.java | 9 +++ .../mpc/springboot/shared/utils/TagUtils.java | 16 +++++ 7 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 spring-boot/src/test/java/com/mpc/springboot/member/presentation/controller/MemberRestControllerIntegrationTest.java create mode 100644 spring-boot/src/test/java/com/mpc/springboot/shared/AbstractIntegrationTest.java create mode 100644 spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java create mode 100644 spring-boot/src/test/java/com/mpc/springboot/shared/utils/TagUtils.java diff --git a/spring-boot/build.gradle b/spring-boot/build.gradle index 77626e9..336646e 100644 --- a/spring-boot/build.gradle +++ b/spring-boot/build.gradle @@ -37,6 +37,8 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testImplementation 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' } tasks.named('test') { diff --git a/spring-boot/src/test/java/com/mpc/springboot/member/infrastructure/persistence/jpa/repository/MemberRepositoryTest.java b/spring-boot/src/test/java/com/mpc/springboot/member/infrastructure/persistence/jpa/repository/MemberRepositoryTest.java index 78fc24f..0689d6a 100644 --- a/spring-boot/src/test/java/com/mpc/springboot/member/infrastructure/persistence/jpa/repository/MemberRepositoryTest.java +++ b/spring-boot/src/test/java/com/mpc/springboot/member/infrastructure/persistence/jpa/repository/MemberRepositoryTest.java @@ -8,6 +8,7 @@ import com.mpc.springboot.member.domain.vo.MemberCode; import com.mpc.springboot.member.domain.vo.MemberName; import com.mpc.springboot.shared.AbstractRepositoryTest; +import com.mpc.springboot.shared.type.TestTag; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; @@ -28,7 +29,7 @@ protected void setUp() { } @DisplayName("멤버 저장 테스트") - @Tag(NO_SETUP) + @Tag(TestTag.NO_SETUP) @Test void save() { // given diff --git a/spring-boot/src/test/java/com/mpc/springboot/member/presentation/controller/MemberRestControllerIntegrationTest.java b/spring-boot/src/test/java/com/mpc/springboot/member/presentation/controller/MemberRestControllerIntegrationTest.java new file mode 100644 index 0000000..ceced1d --- /dev/null +++ b/spring-boot/src/test/java/com/mpc/springboot/member/presentation/controller/MemberRestControllerIntegrationTest.java @@ -0,0 +1,65 @@ +package com.mpc.springboot.member.presentation.controller; + +import com.mpc.springboot.member.domain.entity.Member; +import com.mpc.springboot.member.domain.repository.MemberRepository; +import com.mpc.springboot.member.domain.vo.MemberCode; +import com.mpc.springboot.member.domain.vo.MemberName; +import com.mpc.springboot.shared.AbstractIntegrationTest; +import com.mpc.springboot.shared.type.TestTag; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + + +class MemberRestControllerIntegrationTest extends AbstractIntegrationTest { + + private Member savedMember; + + @Autowired + private MemberRepository memberRepository; + + @Override + protected void setUp() { + // given + MemberCode code = MemberCode.of("T0000001"); + MemberName name = MemberName.of("Alice", "Smith"); + savedMember = memberRepository.save(Member.of(code, name)); + } + + @DisplayName("멤버 생성 API 통합 테스트") + @Tag(TestTag.NO_SETUP) + @Test + void createMember() throws Exception { + // given + MemberCode code = MemberCode.of("T0000001"); + MemberName name = MemberName.of("Alice", "Smith"); + Member member = Member.of(code, name); + + // when & then + mockMvc.perform(post("/api/v1/members") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(member))) + .andExpect(status().isOk()); + } + + + + @DisplayName("멤버 조회 API 통합 테스트") + @Test + void getMemberBy() throws Exception { + // given + MemberCode code = savedMember.getCode(); + MemberName name = savedMember.getName(); + + // when & then + mockMvc.perform(get("/api/v1/members/{code}", code.getValue())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code.value").value(code.getValue())) + .andExpect(jsonPath("$.name.firstName").value(name.getFirstName())) + .andExpect(jsonPath("$.name.lastName").value(name.getLastName())) + .andExpect(jsonPath("$.name.fullName").value(name.getFullName())); + } +} diff --git a/spring-boot/src/test/java/com/mpc/springboot/shared/AbstractIntegrationTest.java b/spring-boot/src/test/java/com/mpc/springboot/shared/AbstractIntegrationTest.java new file mode 100644 index 0000000..97e721e --- /dev/null +++ b/spring-boot/src/test/java/com/mpc/springboot/shared/AbstractIntegrationTest.java @@ -0,0 +1,36 @@ +package com.mpc.springboot.shared; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.mpc.springboot.Application; +import com.mpc.springboot.shared.utils.TagUtils; +import org.junit.jupiter.api.*; + + +@SpringBootTest(classes = Application.class) +@AutoConfigureMockMvc +@Transactional +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public abstract class AbstractIntegrationTest { + + @Autowired + protected MockMvc mockMvc; + + @Autowired + protected ObjectMapper objectMapper; + + + @BeforeEach + void commonSetUp(TestInfo testInfo) { + if (TagUtils.hasNoSetupTag(testInfo)) { + return; + } + setUp(); + } + + protected abstract void setUp(); +} diff --git a/spring-boot/src/test/java/com/mpc/springboot/shared/AbstractRepositoryTest.java b/spring-boot/src/test/java/com/mpc/springboot/shared/AbstractRepositoryTest.java index ae94a90..f35b91a 100644 --- a/spring-boot/src/test/java/com/mpc/springboot/shared/AbstractRepositoryTest.java +++ b/spring-boot/src/test/java/com/mpc/springboot/shared/AbstractRepositoryTest.java @@ -3,6 +3,7 @@ import jakarta.transaction.Transactional; import org.springframework.boot.test.context.SpringBootTest; +import com.mpc.springboot.shared.utils.TagUtils; import org.junit.jupiter.api.*; @SpringBootTest @@ -10,20 +11,13 @@ @TestInstance(TestInstance.Lifecycle.PER_CLASS) public abstract class AbstractRepositoryTest { - protected static final String NO_SETUP = "NoSetup"; - @BeforeEach void commonSetUp(TestInfo testInfo) { - if (hasNoSetupTag(testInfo)) { + if (TagUtils.hasNoSetupTag(testInfo)) { return; } setUp(); } - private static boolean hasNoSetupTag(TestInfo testInfo) { - return testInfo.getTags() - .contains(NO_SETUP); - } - protected abstract void setUp(); } diff --git a/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java b/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java new file mode 100644 index 0000000..ca95e04 --- /dev/null +++ b/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java @@ -0,0 +1,9 @@ +package com.mpc.springboot.shared.type; + +import lombok.Getter; + + +public class TestTag { + + public static final String NO_SETUP = "no-setup"; +} diff --git a/spring-boot/src/test/java/com/mpc/springboot/shared/utils/TagUtils.java b/spring-boot/src/test/java/com/mpc/springboot/shared/utils/TagUtils.java new file mode 100644 index 0000000..8f27555 --- /dev/null +++ b/spring-boot/src/test/java/com/mpc/springboot/shared/utils/TagUtils.java @@ -0,0 +1,16 @@ +package com.mpc.springboot.shared.utils; + +import com.mpc.springboot.shared.type.TestTag; +import org.junit.jupiter.api.TestInfo; + +public class TagUtils { + + private TagUtils() { + // Utility class + } + + public static boolean hasNoSetupTag(TestInfo testInfo) { + return testInfo.getTags() + .contains(TestTag.NO_SETUP); + } +} From 107e9d807bc55f5be2031fa2ea5e8f1471ba2418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A4=80=ED=97=8C?= Date: Fri, 28 Feb 2025 18:47:30 +0900 Subject: [PATCH 2/2] Remove unused Lombok import from TestTag class The `@Getter` annotation and corresponding import were removed as they were not being used. This cleanup improves code readability and eliminates unnecessary dependencies. --- .../src/test/java/com/mpc/springboot/shared/type/TestTag.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java b/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java index ca95e04..c5cf86f 100644 --- a/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java +++ b/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java @@ -1,7 +1,5 @@ package com.mpc.springboot.shared.type; -import lombok.Getter; - public class TestTag {