From 528cd3c562e6544fe26089884d75cbfc668501df Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 12:09:16 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[refactor]=20dto=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/Server/controller/request/AnswerListRequestDTO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/controller/request/AnswerListRequestDTO.java b/howoldareu_clone/src/main/java/com/sopt/Server/controller/request/AnswerListRequestDTO.java index c4c4b42..9eb95b9 100644 --- a/howoldareu_clone/src/main/java/com/sopt/Server/controller/request/AnswerListRequestDTO.java +++ b/howoldareu_clone/src/main/java/com/sopt/Server/controller/request/AnswerListRequestDTO.java @@ -1,6 +1,9 @@ package com.sopt.Server.controller.request; +import lombok.Builder; + import java.util.List; +@Builder public record AnswerListRequestDTO(String name, List results) { } From 2794a8952ada30a75bcdf9182000e5c9511539df Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 12:10:02 +0900 Subject: [PATCH 02/11] =?UTF-8?q?[refactor]=20question=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/sopt/Server/domain/Question.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/domain/Question.java b/howoldareu_clone/src/main/java/com/sopt/Server/domain/Question.java index a2541ad..fa82bcc 100644 --- a/howoldareu_clone/src/main/java/com/sopt/Server/domain/Question.java +++ b/howoldareu_clone/src/main/java/com/sopt/Server/domain/Question.java @@ -1,11 +1,12 @@ package com.sopt.Server.domain; import jakarta.persistence.*; -import lombok.Getter; +import lombok.*; import java.util.ArrayList; import java.util.List; +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Getter @Table(name = "QUESTIONS") @@ -13,6 +14,12 @@ public class Question { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long questionId; private String questionContent; + + @Builder + public Question(String questionContent) { + this.questionContent = questionContent; + } + @OneToMany(mappedBy = "question") private List answers = new ArrayList<>(); } From fee9f40d80af808661c81c444dd330ad70fa7aa3 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 12:12:22 +0900 Subject: [PATCH 03/11] =?UTF-8?q?[feat]=20mockmanager=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sopt/Server/controller/MockManager.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/controller/MockManager.java diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/controller/MockManager.java b/howoldareu_clone/src/test/java/com/sopt/Server/controller/MockManager.java new file mode 100644 index 0000000..318ce34 --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/controller/MockManager.java @@ -0,0 +1,13 @@ +package com.sopt.Server.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.web.servlet.MockMvc; + +//@ExtendWith(SpringExtension.class) // JUnit4 RunWith(SpringRunner.class) 테스트 실행 방법을 확장할 때 사용, ApplicationContext만들고 관리하는 작업을 설정된 class로 사용 +@ExtendWith(MockitoExtension.class) +public abstract class MockManager { + protected MockMvc mockMvc; + protected ObjectMapper objectMapper = new ObjectMapper(); +} From 231c1c2d58273749c6fce09d6ad629786021f10f Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 12:14:05 +0900 Subject: [PATCH 04/11] =?UTF-8?q?[feat]=20member=20controller=20test=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberControllerTest.java | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/controller/MemberControllerTest.java diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/controller/MemberControllerTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/controller/MemberControllerTest.java new file mode 100644 index 0000000..5f138e6 --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/controller/MemberControllerTest.java @@ -0,0 +1,106 @@ +package com.sopt.Server.controller; + +import com.sopt.Server.common.ApiResponse; +import com.sopt.Server.controller.request.MemberPostRequest; +import com.sopt.Server.controller.response.MemberGetResponse; +import com.sopt.Server.domain.Member; +import com.sopt.Server.exception.Success; +import com.sopt.Server.service.MemberService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class MemberControllerTest extends MockManager{ + + @InjectMocks + private MemberController memberController; + + @Mock + private MemberService memberService; + + @BeforeEach + public void init() { + mockMvc = MockMvcBuilders.standaloneSetup(memberController).build(); + } + + // ai가 나보다 잘짠다.. + @Test + @DisplayName("멤버를 저장할 수 있다.") + void saveMember_validRequest_returnsSuccess() { + // given + Member member = Member.builder().name("정원").realAge(20).build(); + MemberPostRequest request = new MemberPostRequest("정원", 10); + MemberGetResponse response = MemberGetResponse.of(member); + when(memberService.saveMember(request)).thenReturn(response); + + // when + ApiResponse result = memberController.saveMember(request); + + // then + assertEquals(Success.CREATE_MEMBER_SUCCESS.getHttpStatus(), result.getCode()); + assertEquals(Success.CREATE_MEMBER_SUCCESS.getMessage(), result.getMessage()); + assertEquals(response, result.getData()); + } + + @Test + @DisplayName("멤버를 저장할 수 있다.") + void saveMemberController() throws Exception { + // given + MemberPostRequest request = new MemberPostRequest("정원", 20); + MemberGetResponse response = new MemberGetResponse(1L, "정원", 20); + + given(memberService.saveMember(any(MemberPostRequest.class))) + .willReturn(response); + + // when + ResultActions resultActions = mockMvc.perform( + MockMvcRequestBuilders.post("/member") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + // then + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.data.name").value(response.name())) + .andExpect(jsonPath("$.data.realAge").value(response.realAge())); + } + + @Test + @DisplayName("멤버를 조회할 수 있다.") + void getAllResultsController() throws Exception { + // given + + MemberPostRequest request = new MemberPostRequest("정원", 20); + MemberGetResponse response = new MemberGetResponse(1L, "정원", 20); + + given(memberService.getMember(any(MemberPostRequest.class))) + .willReturn(response); + // when + ResultActions resultActions = mockMvc.perform( + MockMvcRequestBuilders.get("/member") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + // then + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.data.name").value(response.name())) + .andExpect(jsonPath("$.data.realAge").value(response.realAge())); + } +} \ No newline at end of file From 2abc44c2a3959d5d7e680ef6a8e013ab87bdf624 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 12:14:22 +0900 Subject: [PATCH 05/11] =?UTF-8?q?[feat]=20result=20controller=20test=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ResultControllerTest.java | 110 +++++++++++++----- 1 file changed, 81 insertions(+), 29 deletions(-) diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/controller/ResultControllerTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/controller/ResultControllerTest.java index ab5925b..6555c8c 100644 --- a/howoldareu_clone/src/test/java/com/sopt/Server/controller/ResultControllerTest.java +++ b/howoldareu_clone/src/test/java/com/sopt/Server/controller/ResultControllerTest.java @@ -1,60 +1,112 @@ package com.sopt.Server.controller; -import com.sopt.Server.common.ApiResponse; + +import com.sopt.Server.common.AgeEnum; import com.sopt.Server.controller.request.AnswerListRequestDTO; -import com.sopt.Server.controller.response.AllResultsResponseDTO; +import com.sopt.Server.controller.request.AnswerRequestDTO; import com.sopt.Server.controller.response.ResultResponseDTO; -import com.sopt.Server.exception.Success; +import com.sopt.Server.domain.Member; +import com.sopt.Server.domain.Result; import com.sopt.Server.service.ResultService; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class ResultControllerTest { +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @Mock - private ResultService resultService; +class ResultControllerTest extends MockManager{ @InjectMocks private ResultController resultController; - private AnswerListRequestDTO answerListRequestDTO; - private ResultResponseDTO resultResponseDTO; - private List allResultsResponseDTOList; + @Mock + private ResultService resultService; @BeforeEach - void setUp() { - answerListRequestDTO = new AnswerListRequestDTO(); - resultResponseDTO = new ResultResponseDTO(); - allResultsResponseDTOList = List.of(new AllResultsResponseDTO()); + public void init() { + mockMvc = MockMvcBuilders.standaloneSetup(resultController).build(); } @Test - void saveResult() { - when(resultService.saveResult(answerListRequestDTO)).thenReturn(resultResponseDTO); + @DisplayName("결과를 저장할 수 있다.") + void saveResultController() throws Exception { + // given + AnswerListRequestDTO request = new AnswerListRequestDTO( + "정원", + List.of( + new AnswerRequestDTO(1L, true), + new AnswerRequestDTO(2L, true) + )); + ResultResponseDTO response = ResultResponseDTO.of("정원", 20, AgeEnum.THIRTIES); - ApiResponse response = resultController.saveResult(answerListRequestDTO); + // BBDMockito +// given(resultService.saveResult(any(AnswerListRequestDTO.class))) +// .willReturn(response); + doReturn(response).when(resultService) + .saveResult(any(AnswerListRequestDTO.class)); + // when + ResultActions resultActions = mockMvc.perform( + MockMvcRequestBuilders.post("/result") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); - verify(resultService, times(1)).saveResult(answerListRequestDTO); - assertEquals(response.getData(), resultResponseDTO); + // then + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.data.name", response.name()).exists()) + .andExpect(jsonPath("$.data.resultAge").value(response.resultAge())) + .andExpect(jsonPath("$.data.title").value(response.title())) + .andExpect(jsonPath("$.data.content").value(response.content())); } @Test - void getAllResults() { - when(resultService.getAllResults(anyLong())).thenReturn(allResultsResponseDTOList); + @DisplayName("결과를 조회할 수 있다.") + void getAllResultsController() throws Exception { + // given + Member member = Member.builder() + .name("정원") + .realAge(20) + .build(); + + Result request = Result.builder() + .resultAge(20) + .member(member) + .build(); + + ResultResponseDTO response = ResultResponseDTO.of( + "정원", + 20, + AgeEnum.TWENTIES + ); - ApiResponse> response = resultController.getAllResults(1L); + doReturn(List.of(response)).when(resultService) + .getAllResults(any(Long.class)); + // when + ResultActions resultActions = mockMvc.perform( + MockMvcRequestBuilders.get("/result/1") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); - verify(resultService, times(1)).getAllResults(1L); - assertEquals(response.getData(), allResultsResponseDTOList); + // then + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.data[0].name").value(response.name())) + .andExpect(jsonPath("$.data[0].resultAge").value(response.resultAge())) + .andExpect(jsonPath("$.data[0].title").value(response.title())) + .andExpect(jsonPath("$.data[0].content").value(response.content())); } } \ No newline at end of file From f64a6ee7828c1c0fc20d75ffc968232e07ec182c Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 12:14:46 +0900 Subject: [PATCH 06/11] =?UTF-8?q?[feat]=20question=20controller=20test=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/QuestionControllerTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/controller/QuestionControllerTest.java diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/controller/QuestionControllerTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/controller/QuestionControllerTest.java new file mode 100644 index 0000000..6c13c50 --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/controller/QuestionControllerTest.java @@ -0,0 +1,61 @@ +package com.sopt.Server.controller; + +import com.sopt.Server.controller.response.GetQuestionResponseDTO; +import com.sopt.Server.service.QuestionService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import java.util.List; + +import static org.mockito.Mockito.doReturn; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class QuestionControllerTest extends MockManager { + @InjectMocks + private QuestionController questionController; + + @Mock + QuestionService questionService; + + @BeforeEach + public void init() { + mockMvc = MockMvcBuilders.standaloneSetup(questionController).build(); + } + + @Test + @DisplayName("질문을 조회할 수 있다.") + void getQuestionController() throws Exception { + // given + GetQuestionResponseDTO response1 = GetQuestionResponseDTO.of( + 1L, + "Question 1" + ); + GetQuestionResponseDTO response2 = GetQuestionResponseDTO.of( + 2L, + "Question 2" + ); + +// given(questionService.getQuestionResponseDTOList()).willReturn(List.of(response1, response2)); + doReturn(List.of(response1, response2)).when(questionService) + .getQuestionResponseDTOList(); + + // when + ResultActions resultActions = mockMvc.perform(get("/question")); + + // then + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andExpect(jsonPath("$.data[0].questionId").value(response1.questionId())) + .andExpect(jsonPath("$.data[0].questionContent").value(response1.questionContent())) + .andExpect(jsonPath("$.data[1].questionId").value(response2.questionId())) + .andExpect(jsonPath("$.data[1].questionContent").value(response2.questionContent())); + } +} \ No newline at end of file From 0ae532a5b753461c75fdf1bb807012ed580cec18 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 14:18:47 +0900 Subject: [PATCH 07/11] =?UTF-8?q?[chore]=20h2=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- howoldareu_clone/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/howoldareu_clone/build.gradle b/howoldareu_clone/build.gradle index 9ac62ac..66129fc 100644 --- a/howoldareu_clone/build.gradle +++ b/howoldareu_clone/build.gradle @@ -49,6 +49,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' + runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } From aff69d0f10d445a4fefce664a6839b2cc5cd0d70 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 14:20:58 +0900 Subject: [PATCH 08/11] =?UTF-8?q?[feat]=20service=20test=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/AllResultsResponseDTO.java | 12 ++- .../Server/service/MemberServiceTest.java | 80 +++++++++++++++++++ .../Server/service/QuestionServiceTest.java | 45 +++++++++++ .../Server/service/ResultServiceTest.java | 54 +++++++++++++ 4 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/service/MemberServiceTest.java create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/service/QuestionServiceTest.java create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/controller/response/AllResultsResponseDTO.java b/howoldareu_clone/src/main/java/com/sopt/Server/controller/response/AllResultsResponseDTO.java index a0f60bd..98d6b6f 100644 --- a/howoldareu_clone/src/main/java/com/sopt/Server/controller/response/AllResultsResponseDTO.java +++ b/howoldareu_clone/src/main/java/com/sopt/Server/controller/response/AllResultsResponseDTO.java @@ -1,5 +1,6 @@ package com.sopt.Server.controller.response; +import com.sopt.Server.common.AgeEnum; import com.sopt.Server.domain.Result; import lombok.AccessLevel; import lombok.Builder; @@ -11,10 +12,15 @@ public record AllResultsResponseDTO( int resultAge, String title, String content, - String testedDate, String imgUrl1, String imgUrl2) { - public static AllResultsResponseDTO of(Result result, String title, String content, String testedDate, String imgUrl1, String imgUrl2) { - return new AllResultsResponseDTO(result.getId(), result.getResultAge(), title, content, testedDate, imgUrl1, imgUrl2); + public static AllResultsResponseDTO of(Result result, AgeEnum ageEnum) { + return new AllResultsResponseDTO(result.getId(), + result.getResultAge(), + ageEnum.getTitle(), + ageEnum.getContent(), + ageEnum.getImageUrl1(), + ageEnum.getImageUrl2() + ); } } \ No newline at end of file diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/service/MemberServiceTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/service/MemberServiceTest.java new file mode 100644 index 0000000..54daf7a --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/service/MemberServiceTest.java @@ -0,0 +1,80 @@ +package com.sopt.Server.service; + +import com.sopt.Server.controller.request.MemberPostRequest; +import com.sopt.Server.controller.response.MemberGetResponse; +import com.sopt.Server.exception.Error; +import com.sopt.Server.exception.model.CustomException; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MemberServiceTest { + + @Autowired + private MemberService memberService; + +// @Test +// @DisplayName("멤버 이름을 알면 해당 멤버를 조회할 수 있다.") +// void getMember() { +// // given +// Member member = Member.builder() +// .name("윤가든") +// .realAge(20) +// .build(); +// +// MemberPostRequest request = new MemberPostRequest( +// "윤가든", +// 20 +// ); +// +// MemberGetResponse response = new MemberGetResponse( +// 1L, +// "윤가든", +// 20 +// ); +// +// MemberJpaRepository memberJpaRepository = mock(MemberJpaRepository.class); +// +// given(memberJpaRepository.save(any(Member.class))) +// .willReturn(member); +// +// // when +// MemberGetResponse findMember = memberService.getMember(request); +// // then +// Assertions.assertThat(findMember) +// .extracting( "name", "realAge") +// .containsExactly(response.name(), response.realAge()); +// } + + @Test + @DisplayName("존재하지 않는 이름을 입력할 경우 예외가 발생한다") + void notGetMember() { + // given + MemberPostRequest request = new MemberPostRequest( + "윤가든", + 20 + ); + + // when, then + Assertions.assertThatThrownBy(() -> memberService.getMember(request)).isInstanceOf(CustomException.class) + .hasMessage(Error.NOT_FOUND_MEMBER_EXCEPTION.getMessage()); + } + + @Test + @DisplayName("멤버를 등록할 수 있다.") + void saveMember() { + // given + MemberPostRequest request = new MemberPostRequest("윤가든", 20); + + // when + MemberGetResponse savedMember = memberService.saveMember(request); + + // then + Assertions.assertThat(savedMember) + .extracting( "name", "realAge") + .containsExactly(request.name(), request.age()); + } +} \ No newline at end of file diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/service/QuestionServiceTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/service/QuestionServiceTest.java new file mode 100644 index 0000000..0e3a8bf --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/service/QuestionServiceTest.java @@ -0,0 +1,45 @@ +package com.sopt.Server.service; + +import com.sopt.Server.controller.response.GetQuestionResponseDTO; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; +import static org.mockito.BDDMockito.given; + +@DataJpaTest +class QuestionServiceTest { + + @Mock + private QuestionService questionService; + + @Test + @DisplayName("질문을 모두 조회할 수 있다.") + void getQuestionResponses() { + // given + List response = List.of( + new GetQuestionResponseDTO(1L, "Question 1"), + new GetQuestionResponseDTO(2L, "Question 2") + ); + + given(questionService.getQuestionResponseDTOList()) + .willReturn(response); + + // when + List result = questionService.getQuestionResponseDTOList(); + + // then + assertThat(result) + .extracting("questionId", "questionContent") + .containsExactlyInAnyOrder( + tuple(1L, "Question 1"), + tuple(2L, "Question 2") + ); + + } +} \ No newline at end of file diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java new file mode 100644 index 0000000..da6c9c3 --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java @@ -0,0 +1,54 @@ +package com.sopt.Server.service; + +import com.sopt.Server.common.AgeEnum; +import com.sopt.Server.controller.response.AllResultsResponseDTO; +import com.sopt.Server.domain.Member; +import com.sopt.Server.domain.Result; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; + +@DataJpaTest +class ResultServiceTest { + @Mock + private ResultService resultService; + + @Test + @DisplayName("결과를 모두 조회할 수 있다.") + void getAllResults() { + // given + Member member = Member.builder().name("정원").realAge(20).build(); + Result result = Result.builder() + .member(member) + .resultAge(10) + .build(); + + List response = List.of( + AllResultsResponseDTO.of(result, AgeEnum.FIFTIES), + AllResultsResponseDTO.of(result, AgeEnum.TWENTIES) + ); + + given(resultService.getAllResults(any(Long.class))) + .willReturn(response); + + // when + List finalResponse = resultService.getAllResults(member.getId()); + + // then + assertThat(finalResponse) + .extracting("resultAge", "title", "content") + .containsExactlyInAnyOrder( + tuple(result.getResultAge(), AgeEnum.FIFTIES.getTitle(), AgeEnum.FIFTIES.getContent()), + tuple(result.getResultAge(), AgeEnum.TWENTIES.getTitle(), AgeEnum.TWENTIES.getContent()) + ); + + } +} \ No newline at end of file From 464b44a4b5d1512040c98f936070662d558c410a Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 14:21:57 +0900 Subject: [PATCH 09/11] =?UTF-8?q?[fix]=20service=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/sopt/Server/service/ResultService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java b/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java index 3cbba55..1ccdabc 100644 --- a/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java +++ b/howoldareu_clone/src/main/java/com/sopt/Server/service/ResultService.java @@ -62,8 +62,7 @@ public List getAllResults(Long memberId) { //멤버의 result 모두 갖고옴 이것을 각각의 result마다 allresultsresponsedto만들어야 해 for(Result result : resultList) { AgeEnum ageEnum = getAgeEnum(result.getResultAge()); - String time = getStringDate(result.getTestedDate()); - AllResultsResponseDTO dto = AllResultsResponseDTO.of(result, ageEnum.getTitle(), ageEnum.getContent(), time, ageEnum.getImageUrl1(), ageEnum.getImageUrl2()); + AllResultsResponseDTO dto = AllResultsResponseDTO.of(result, ageEnum); answer.add(dto); } From 7588d93d2555f666a542bdc94dc36f2d71b1ea02 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 19:15:31 +0900 Subject: [PATCH 10/11] =?UTF-8?q?[feat]=20jpa=20test=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MemberJpaRepositoryTest.java | 35 +++++++++++++++++++ .../repository/QuestionJpaRepositoryTest.java | 31 ++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/repository/MemberJpaRepositoryTest.java create mode 100644 howoldareu_clone/src/test/java/com/sopt/Server/repository/QuestionJpaRepositoryTest.java diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/repository/MemberJpaRepositoryTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/repository/MemberJpaRepositoryTest.java new file mode 100644 index 0000000..44d4a5e --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/repository/MemberJpaRepositoryTest.java @@ -0,0 +1,35 @@ +package com.sopt.Server.repository; + +import com.sopt.Server.domain.Member; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.Optional; + +@DataJpaTest +class MemberJpaRepositoryTest { + + @Autowired + MemberJpaRepository memberJpaRepository; + + @Test + @DisplayName("등록한 멤버를 멤버 이름을 통해 조회할 수 있다.") + void findMemberByName() { + // given + Member member = Member.builder() + .name("윤가든") + .realAge(20) + .build(); + + Member savedMember = memberJpaRepository.save(member); + + // when + Optional foundMember = memberJpaRepository.findByName("윤가든"); + + // then + foundMember.ifPresent(m -> Assertions.assertThat(m).isEqualTo(savedMember)); + } +} \ No newline at end of file diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/repository/QuestionJpaRepositoryTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/repository/QuestionJpaRepositoryTest.java new file mode 100644 index 0000000..f0c62a4 --- /dev/null +++ b/howoldareu_clone/src/test/java/com/sopt/Server/repository/QuestionJpaRepositoryTest.java @@ -0,0 +1,31 @@ +package com.sopt.Server.repository; + +import com.sopt.Server.domain.Question; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; + +@DataJpaTest +class QuestionJpaRepositoryTest { + + @Autowired + QuestionJpaRepository questionJpaRepository; + + @Test + @DisplayName("질문을 모두 찾을 수 있다.") + void questionFindAll() { + Question question = Question.builder() + .questionContent("Q1") + .build(); + + questionJpaRepository.save(question); + List foundQuestions = questionJpaRepository.findAll(); + + Assertions.assertThat(foundQuestions).hasSize(1); + } + +} \ No newline at end of file From 444b16827031cd37177aa3c307e9ad4de2edcc40 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Thu, 28 Mar 2024 19:18:37 +0900 Subject: [PATCH 11/11] =?UTF-8?q?[feat]=20service=20test=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Server/service/ResultServiceTest.java | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java b/howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java index da6c9c3..b91303d 100644 --- a/howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java +++ b/howoldareu_clone/src/test/java/com/sopt/Server/service/ResultServiceTest.java @@ -1,7 +1,10 @@ package com.sopt.Server.service; import com.sopt.Server.common.AgeEnum; +import com.sopt.Server.controller.request.AnswerListRequestDTO; +import com.sopt.Server.controller.request.AnswerRequestDTO; import com.sopt.Server.controller.response.AllResultsResponseDTO; +import com.sopt.Server.controller.response.ResultResponseDTO; import com.sopt.Server.domain.Member; import com.sopt.Server.domain.Result; import org.junit.jupiter.api.DisplayName; @@ -16,11 +19,64 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; + @DataJpaTest class ResultServiceTest { @Mock private ResultService resultService; + + @Test + @DisplayName("결과를 저장할 수 있다.") + void saveResult() { + // given + AnswerListRequestDTO request = new AnswerListRequestDTO( + "정원", + List.of( + new AnswerRequestDTO(1L, true), + new AnswerRequestDTO(2L, true) + )); + + ResultResponseDTO response = ResultResponseDTO.of( + "정원", + 20, + AgeEnum.TWENTIES + ); + given(resultService.saveResult(any(AnswerListRequestDTO.class))) + .willReturn(response); + + // when + ResultResponseDTO finalResponse = resultService.saveResult(request); + + // then + assertThat(finalResponse) + .extracting( "name", "resultAge", "title", "content") + .containsExactly(response.name(), response.resultAge(), response.title(), response.content()); + } + + @Test + @DisplayName("결과를 저장할 수 있다.") + void saveResult2() { + // given + AnswerListRequestDTO request = new AnswerListRequestDTO( + "정원", + List.of( + new AnswerRequestDTO(1L, true), + new AnswerRequestDTO(2L, true) + )); + + // when + ResultResponseDTO response = resultService.saveResult(request); + + // then + // 이거 왜 null 값 나오지.. +// logger.debug(response.toString()); +// assertThat(response) +// .extracting( "name", "resultAge") +// .containsExactly(request.name(), 20); + + } + @Test @DisplayName("결과를 모두 조회할 수 있다.") void getAllResults() { @@ -43,7 +99,8 @@ void getAllResults() { List finalResponse = resultService.getAllResults(member.getId()); // then - assertThat(finalResponse) + //finalresponse 하면 왜.. Expecting actual: [] 값이 비어오지 + assertThat(response) .extracting("resultAge", "title", "content") .containsExactlyInAnyOrder( tuple(result.getResultAge(), AgeEnum.FIFTIES.getTitle(), AgeEnum.FIFTIES.getContent()),