Skip to content

Commit 2beb52f

Browse files
authored
Merge pull request #10 from Modern-Programming-Club/feature/3.2.1.-add-unit-test
Refactor member creation flow and add unit tests
2 parents 949b783 + a1852cb commit 2beb52f

File tree

10 files changed

+181
-9
lines changed

10 files changed

+181
-9
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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.Getter;
7+
import lombok.RequiredArgsConstructor;
8+
9+
@Getter
10+
@RequiredArgsConstructor
11+
public class CreateMemberRequest {
12+
private final MemberCode code;
13+
private final MemberName name;
14+
15+
public Member toEntity() {
16+
return Member.of(code, name);
17+
}
18+
}

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

Lines changed: 5 additions & 2 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.CreateMemberRequest;
67
import com.mpc.springboot.member.application.dto.MemberResponse;
78
import com.mpc.springboot.member.domain.entity.Member;
89
import com.mpc.springboot.member.domain.exception.MemberNotFoundException;
@@ -23,7 +24,9 @@ public MemberResponse getMemberBy(MemberCode code) {
2324
}
2425

2526
@Transactional
26-
public Member createMember(Member member) {
27-
return memberRepository.save(member);
27+
public MemberResponse createMember(CreateMemberRequest request) {
28+
Member member = request.toEntity();
29+
Member saved = memberRepository.save(member);
30+
return MemberResponse.from(saved);
2831
}
2932
}

spring-boot/src/main/java/com/mpc/springboot/member/domain/entity/Member.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class Member {
2626
private MemberName name;
2727

2828
@Embedded
29-
private AuditFields auditFields = new AuditFields();
29+
private final AuditFields auditFields = new AuditFields();
3030

3131
private Member(MemberCode code, MemberName name) {
3232
this.code = code;

spring-boot/src/main/java/com/mpc/springboot/member/domain/mapping/MemberCodeConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ public String convertToDatabaseColumn(MemberCode attribute) {
2121
@Override
2222
public MemberCode convertToEntityAttribute(String dbData) {
2323
String value = Objects.requireNonNullElse(dbData, "");
24-
return new MemberCode(value);
24+
return MemberCode.of(value);
2525
}
2626
}

spring-boot/src/main/java/com/mpc/springboot/member/domain/vo/MemberCode.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.mpc.springboot.member.domain.vo;
22

3-
import lombok.Getter;
4-
import lombok.RequiredArgsConstructor;
3+
import lombok.*;
54

65
@Getter
7-
@RequiredArgsConstructor
6+
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
87
public class MemberCode {
98
private final String value;
109

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

Lines changed: 3 additions & 2 deletions
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.CreateMemberRequest;
56
import com.mpc.springboot.member.application.dto.MemberResponse;
67
import com.mpc.springboot.member.application.service.MemberService;
78
import com.mpc.springboot.member.domain.entity.Member;
@@ -21,7 +22,7 @@ public ResponseEntity<MemberResponse> getMemberBy(@PathVariable MemberCode code)
2122
}
2223

2324
@PostMapping
24-
public ResponseEntity<Member> createMember(@RequestBody Member member) {
25-
return ResponseEntity.ok(memberService.createMember(member));
25+
public ResponseEntity<MemberResponse> createMember(@RequestBody CreateMemberRequest request) {
26+
return ResponseEntity.ok(memberService.createMember(request));
2627
}
2728
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.mpc.springboot.member.application.service;
2+
3+
import java.util.Optional;
4+
5+
import com.mpc.springboot.member.application.dto.MemberResponse;
6+
import com.mpc.springboot.member.domain.entity.Member;
7+
import com.mpc.springboot.member.domain.repository.MemberRepository;
8+
import com.mpc.springboot.member.domain.vo.MemberCode;
9+
import com.mpc.springboot.member.domain.vo.MemberName;
10+
import com.mpc.springboot.shared.AbstractServiceTest;
11+
import org.junit.jupiter.api.DisplayName;
12+
import org.junit.jupiter.api.Test;
13+
import org.mockito.InjectMocks;
14+
import org.mockito.Mock;
15+
16+
import static org.junit.jupiter.api.Assertions.*;
17+
import static org.mockito.ArgumentMatchers.any;
18+
import static org.mockito.BDDMockito.given;
19+
20+
class MemberServiceTest extends AbstractServiceTest {
21+
22+
@Mock
23+
private MemberRepository memberRepository;
24+
25+
@InjectMocks
26+
private MemberService memberService;
27+
28+
@DisplayName("멤버 조회 테스트")
29+
@Test
30+
void getMemberBy() {
31+
// given
32+
MemberCode code = MemberCode.of("M0000016");
33+
MemberName name = MemberName.of("Jinwoo", "Kim");
34+
Member member = Member.of(code, name);
35+
Optional<Member> memberOptional = Optional.of(member);
36+
37+
given(memberRepository.findMemberBy(any())).willReturn(memberOptional);
38+
39+
// when
40+
MemberResponse memberResponse = memberService.getMemberBy(code);
41+
42+
// then
43+
assertNotNull(memberResponse);
44+
assertEquals(code, memberResponse.getCode());
45+
assertEquals(name, memberResponse.getName());
46+
}
47+
48+
@Test
49+
void createMember() {
50+
}
51+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.mpc.springboot.member.infrastructure.persistence.jpa.repository;
2+
3+
import java.util.Optional;
4+
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import com.mpc.springboot.member.domain.entity.Member;
7+
import com.mpc.springboot.member.domain.repository.MemberRepository;
8+
import com.mpc.springboot.member.domain.vo.MemberCode;
9+
import com.mpc.springboot.member.domain.vo.MemberName;
10+
import com.mpc.springboot.shared.AbstractRepositoryTest;
11+
import org.junit.jupiter.api.*;
12+
13+
import static org.junit.jupiter.api.Assertions.*;
14+
15+
class MemberRepositoryTest extends AbstractRepositoryTest {
16+
17+
@Autowired
18+
private MemberRepository memberRepository;
19+
20+
private Member savedMember;
21+
22+
@Override
23+
protected void setUp() {
24+
// given
25+
MemberCode code = MemberCode.of("T0000001");
26+
MemberName name = MemberName.of("Alice", "Smith");
27+
savedMember = memberRepository.save(Member.of(code, name));
28+
}
29+
30+
@DisplayName("멤버 저장 테스트")
31+
@Tag(NO_SETUP)
32+
@Test
33+
void save() {
34+
// given
35+
MemberCode code = MemberCode.of("T0000001");
36+
MemberName name = MemberName.of("Alice", "Smith");
37+
Member member = Member.of(code, name);
38+
39+
// when
40+
Member saved = memberRepository.save(member);
41+
42+
// then
43+
assertNotNull(saved);
44+
assertEquals(code, saved.getCode());
45+
assertEquals(name, saved.getName());
46+
}
47+
48+
@Test
49+
void findMemberBy() {
50+
// given
51+
MemberCode code = savedMember.getCode();
52+
53+
// when
54+
Optional<Member> result = memberRepository.findMemberBy(code);
55+
56+
// then
57+
assertTrue(result.isPresent());
58+
assertEquals(savedMember.getCode(), result.get().getCode());
59+
assertEquals(savedMember.getName(), result.get().getName());
60+
}
61+
62+
63+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.mpc.springboot.shared;
2+
3+
import jakarta.transaction.Transactional;
4+
5+
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.junit.jupiter.api.*;
7+
8+
@SpringBootTest
9+
@Transactional
10+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
11+
public abstract class AbstractRepositoryTest {
12+
13+
protected static final String NO_SETUP = "NoSetup";
14+
15+
@BeforeEach
16+
void commonSetUp(TestInfo testInfo) {
17+
if (hasNoSetupTag(testInfo)) {
18+
return;
19+
}
20+
setUp();
21+
}
22+
23+
private static boolean hasNoSetupTag(TestInfo testInfo) {
24+
return testInfo.getTags()
25+
.contains(NO_SETUP);
26+
}
27+
28+
protected abstract void setUp();
29+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.mpc.springboot.shared;
2+
3+
import org.junit.jupiter.api.extension.ExtendWith;
4+
import org.mockito.junit.jupiter.MockitoExtension;
5+
6+
@ExtendWith(MockitoExtension.class)
7+
public abstract class AbstractServiceTest {
8+
}

0 commit comments

Comments
 (0)