@Test voidconfirmMember() { // 상황: 대기 상태 회원이 존재 memoryMemberRepository.save(Member.id(“id”).status(WAITING).builder().build()); // 실행: 회원을 승인하면 confirmMemberService.confirm(“id”); // 결과: 회원이 활성 상태가 됨 Memberm= memoryMemberRepository.findById(“id”); assertThat(m.getStatus()).isEqualTo(ACTIVE); }
외부 상태에 의존하는경우 대역을 사용한다. (ex. 외부서버에 붙거나, 내가 붙기힘든것들..)
대역(double 라고 함)
대체구현은 대역을 이요해서 테스트에 필요한 상황/결과를 구성
대역의 종류 스텁 (stub) - 구현을 최대한 단순한 것으로 대체 result를 미리 세팅해놓고 활용
publicclassMemoryMemberRepositoryimplementsMemberRepository { private Map<String,Member> members = newHashMap<>(); @Override public Member findById(String id) { return members.get(id); } publicvoidsave(Member member) { member.put(member.getId(), member); } }
스파이(spy) - 호출된 내역을 기록하여 활용 mock는 목 객체 그자체를 의미하여 껍데기만 있는 클래스라고 볼 수 있다. 즉 Mocking를 해야 무언가가 리턴됨 spy는 기존의 클래스기능을 기대로 쓰되 일부분만 mock하여 활용가능함.
MyWorkflow라는 Service가 있고 이 Service는 UserService, LoginService를 주입받는애라고 할 때 아래처럼 코드가 구성될것이다.
UserService, LoginService 는 모든 메소드에 Mocking을 걸어야 사용가능하지만 MyWorkflow의 경우 기존에있는 아무 메소드나 호출이 가능함. 근데 Mocking를 걸려면 @Spy를 추가로 붙여줘야 한다. 즉 MyWorkflow를 테스트하기 위해 만든 MyWorkflowTest내 에서 MyWorkflow를 테스트하기 위해 Mocking할 때 사용된다고 보면될듯하다