Skip to content

Commit 949b783

Browse files
authored
Merge pull request #9 from Modern-Programming-Club/feature/3.2.1.-add-unit-test
Feature/3.2.1. add unit test
2 parents d96677f + d45c31e commit 949b783

File tree

8 files changed

+103
-8
lines changed

8 files changed

+103
-8
lines changed

plan/4.3. study_plan-week-3-summary.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
- **3.1.4.** ManyToOne, OneToMany 사용
99
- **3.2.** Spring Boot 테스트 코드 작성
1010
- **3.2.1.** 단위 테스트 (Unit Test) 작성
11-
- **3.2.1.1.** 테스트 관점에서의 Request, Response DTO 클래스 작성의 필요성
11+
- MockMvc 사용
12+
- 테스트 관점에서의 Request, Response DTO 클래스 작성의 필요성
1213
- **3.2.2.** 통합 테스트 (Integration Test) 작성
13-
- **3.2.3.** MockMvc 사용
1414
- **3.3.** RESTful API 설계 및 구현
1515
- **3.3.1.** RESTful API 기본 원칙
16-
- **3.3.1.1.** 데이터 전송 관점에서의 Request, Response DTO 클래스 작성
16+
- 데이터 전송 관점에서의 Request, Response DTO 클래스 작성의 필요성
1717
- **3.3.3.** API 예외 처리
1818
- **3.3.4.** Spring Validation 사용
1919
- **3.3.5.** Converter 사용

spring-boot/src/main/java/com/mpc/springboot/Application.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
55
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
66

7-
@EnableJpaAuditing
87
@SpringBootApplication
98
public class Application {
109

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.mpc.springboot.config.audit;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
5+
6+
@EnableJpaAuditing
7+
@Configuration
8+
public class AuditingConfiguration {
9+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.mpc.springboot.member.application.dto;
2+
3+
import com.mpc.springboot.member.domain.entity.Member;
4+
import com.mpc.springboot.member.domain.vo.MemberCode;
5+
import com.mpc.springboot.member.domain.vo.MemberName;
6+
import lombok.*;
7+
8+
@Getter
9+
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
10+
public class MemberResponse {
11+
private final MemberCode code;
12+
private final MemberName name;
13+
14+
public static MemberResponse from(Member member) {
15+
return new MemberResponse(member.getCode(), member.getName());
16+
}
17+
}

spring-boot/src/main/java/com/mpc/springboot/member/application/service/MemberService.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import jakarta.transaction.Transactional;
44

55
import org.springframework.stereotype.Service;
6+
import com.mpc.springboot.member.application.dto.MemberResponse;
67
import com.mpc.springboot.member.domain.entity.Member;
78
import com.mpc.springboot.member.domain.exception.MemberNotFoundException;
89
import com.mpc.springboot.member.domain.repository.MemberRepository;
@@ -15,9 +16,10 @@ public class MemberService {
1516

1617
private final MemberRepository memberRepository;
1718

18-
public Member getMemberBy(MemberCode code) {
19-
return memberRepository.findMemberBy(code)
20-
.orElseThrow(MemberNotFoundException::new);
19+
public MemberResponse getMemberBy(MemberCode code) {
20+
Member member = memberRepository.findMemberBy(code)
21+
.orElseThrow(MemberNotFoundException::new);
22+
return MemberResponse.from(member);
2123
}
2224

2325
@Transactional

spring-boot/src/main/java/com/mpc/springboot/member/presentation/controller/MemberRestController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.springframework.http.ResponseEntity;
44
import org.springframework.web.bind.annotation.*;
5+
import com.mpc.springboot.member.application.dto.MemberResponse;
56
import com.mpc.springboot.member.application.service.MemberService;
67
import com.mpc.springboot.member.domain.entity.Member;
78
import com.mpc.springboot.member.domain.vo.MemberCode;
@@ -15,7 +16,7 @@ public class MemberRestController {
1516
private final MemberService memberService;
1617

1718
@GetMapping("/{code}")
18-
public ResponseEntity<Member> getMemberBy(@PathVariable MemberCode code) {
19+
public ResponseEntity<MemberResponse> getMemberBy(@PathVariable MemberCode code) {
1920
return ResponseEntity.ok(memberService.getMemberBy(code));
2021
}
2122

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.mpc.springboot.member.presentation.controller;
2+
3+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
4+
import org.springframework.test.context.bean.override.mockito.MockitoBean;
5+
import com.mpc.springboot.member.application.dto.MemberResponse;
6+
import com.mpc.springboot.member.application.service.MemberService;
7+
import com.mpc.springboot.member.domain.entity.Member;
8+
import com.mpc.springboot.member.domain.repository.MemberRepository;
9+
import com.mpc.springboot.member.domain.vo.MemberCode;
10+
import com.mpc.springboot.member.domain.vo.MemberName;
11+
import com.mpc.springboot.shared.AbstractControllerTest;
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
15+
import static org.mockito.ArgumentMatchers.any;
16+
import static org.mockito.BDDMockito.given;
17+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
18+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
19+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
20+
21+
@WebMvcTest(MemberRestController.class)
22+
class MemberRestControllerTest extends AbstractControllerTest {
23+
24+
@MockitoBean
25+
private MemberService memberService;
26+
27+
/**
28+
* @see MemberRestController#getMemberBy(MemberCode)
29+
*/
30+
@DisplayName("회원 조회: 회원 코드로 조회")
31+
@Test
32+
void getMemberBy() throws Exception {
33+
// given
34+
MemberCode code = MemberCode.of("M0000003");
35+
MemberName name = MemberName.of("John", "Doe");
36+
Member member = Member.of(code, name);
37+
MemberResponse memberResponse = MemberResponse.from(member);
38+
given(memberService.getMemberBy(any())).willReturn(memberResponse);
39+
40+
// when & then
41+
mockMvc.perform(get("/api/v1/members/{code}", code.getValue()))
42+
.andExpect(status().isOk())
43+
.andExpect(jsonPath("$.code.value").value(code.getValue()))
44+
.andExpect(jsonPath("$.name.firstName").value(name.getFirstName()))
45+
.andExpect(jsonPath("$.name.lastName").value(name.getLastName()))
46+
.andExpect(jsonPath("$.name.fullName").value(name.getFullName()));
47+
48+
}
49+
50+
@Test
51+
void createMember() {
52+
}
53+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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.autoconfigure.web.servlet.WebMvcTest;
6+
import org.springframework.test.web.servlet.MockMvc;
7+
8+
@WebMvcTest
9+
@AutoConfigureMockMvc
10+
public abstract class AbstractControllerTest {
11+
12+
@Autowired
13+
protected MockMvc mockMvc;
14+
}

0 commit comments

Comments
 (0)