Skip to content

Commit

Permalink
모의 객체(Mock)를 통해 Stub과 Spy 대체 - #71
Browse files Browse the repository at this point in the history
- 모의 객체 생성,
- BDDMockito를 사용하여 Stub을 대체
- 모의 객체가 기대한 대로 불렸는지 검증
- Spy 대체
  • Loading branch information
hou27 committed Feb 7, 2023
1 parent 59eff05 commit 1e63536
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.hou27.chap07.mock;

public interface EmailNotifier {
void sendRegisterEmail(String email);
}
27 changes: 27 additions & 0 deletions 김정호/src/test/java/com/hou27/chap07/mock/UserRegister.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.hou27.chap07.mock;

public class UserRegister {
private WeakPasswordChecker passwordChecker;
private UserRepository userRepository;
private EmailNotifier emailNotifier;

public UserRegister(WeakPasswordChecker passwordChecker,
EmailNotifier emailNotifier,
UserRepository userRepository) {
this.passwordChecker = passwordChecker;
this.emailNotifier = emailNotifier;
this.userRepository = userRepository;
}

public void register(String id, String pw, String email) {
if(passwordChecker.checkPasswordWeak(pw)) {
throw new WeakPasswordException();
}

User user = new User(id, pw, email);
userRepository.save(user);

emailNotifier.sendRegisterEmail(email);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.hou27.chap07.mock;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class UserRegisterMockTest {

private UserRegister userRegister;
private WeakPasswordChecker mockPasswordChecker
= Mockito.mock(WeakPasswordChecker.class);
private EmailNotifier mockEmailNotifier
= Mockito.mock(EmailNotifier.class);
private UserRepository fakeRepository
= new MemoryUserRepository();

@BeforeEach
void setUp() {
userRegister = new UserRegister(
mockPasswordChecker,
mockEmailNotifier,
fakeRepository
);
}

@Test
@DisplayName("약한 암호면 가입 실패")
void whenWeakPassword_thenFailRegister() {
BDDMockito.given(mockPasswordChecker.checkPasswordWeak("pw"))
.willReturn(true);

assertThrows(WeakPasswordException.class, () -> {
userRegister.register("id", "pw", "email");
});
}

@Test
@DisplayName("회원 가입 시 암호 검사 수행")
void whenRegister_thenCheckPassword() {
userRegister.register("id", "pw", "email");

BDDMockito.then(mockPasswordChecker)
.should()
.checkPasswordWeak("pw");
}

@Test
@DisplayName("가입 시 메일 전송")
void whenRegister_thenSendMail() {
userRegister.register("id", "pw", "[email protected]");

ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
BDDMockito.then(mockEmailNotifier)
.should()
.sendRegisterEmail(captor.capture());

String realEmail = captor.getValue();
assertEquals("[email protected]", realEmail);
}
}

0 comments on commit 1e63536

Please sign in to comment.