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..c5cf86f --- /dev/null +++ b/spring-boot/src/test/java/com/mpc/springboot/shared/type/TestTag.java @@ -0,0 +1,7 @@ +package com.mpc.springboot.shared.type; + + +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); + } +}