질문, 피드백 등 모든 댓글 환영합니다!
지난 시간에 개발한 Entity,Repository, Service가 정상 동작하는지 테스트 코드를 작성해보겠습니다.
테스트는 JUnit5를 사용했습니다.
@SpringBootTest : 스프링 통합 테스트 기능 제공
@Autowired : 등록된 스프링 빈 중 적절한 객체를 주입해 줌.
@Test : 단위 테스트 기능 제공
++ 추가로 org.assertj.core.api.Assertions.assertThat
을 static으로 import 했습니다.
회원 저장 기능 테스트
@SpringBootTest
class MemberRepositoryTest {
@Autowired
MemberServiceImpl service;
@Test
public void save() throws Exception {
//given
Member member1 = new Member("123", "456", "member1");
Member member2 = new Member("123", "555", "member2");
//when
Long savedId1 = service.save(member1);
Long savedId2 = service.save(member2);
//then
assertThat(savedId1).isEqualTo(member1.getId());
assertThat(savedId2).isNull();
}
}
class Member {
public Member(String loginId, String password, String name) {...
회원 loginId가 없으면 가입 성공, 중복이면 가입 실패. Member 인자의 null 검증은 Dto 레벨에서 검증 예정.
회원 로그인 기능 테스트
class MemberRepositoryTest {
@Autowired
MemberServiceImpl service;
@Autowired
LoginServiceImpl loginService;
@Test
public void login() throws Exception {
//given
Member member1 = new Member("123", "456", "member1");
service.save(member1);
//when
Optional<Member> loginMember1 = loginService.login("123", "456"); // O, O
Optional<Member> loginMember2 = loginService.login("123", "555"); // O, X
Optional<Member> loginMember3 = loginService.login("333", "123"); // X, O
Optional<Member> loginMember4 = loginService.login("333", "333"); // X, O
//then
assertThat(loginMember1.isPresent()).isTrue();
assertThat(loginMember2.isPresent()).isFalse();
assertThat(loginMember3.isPresent()).isFalse();
assertThat(loginMember4.isPresent()).isFalse();
}
loginId와 password가 둘 다 맞을 시 로그인 성공
ToDo 저장 기능 테스트
@SpringBootTest
class ToDoRepositoryTest {
@Autowired
MemberServiceImpl memberService;
@Autowired
ToDoServiceImpl toDoService;
@Test
@Transactional
public void save() throws Exception {
//given
Member member1 = new Member("111", "456", "member1");
ToDo toDo = ToDo.createToDo("title", "description", null, member1);
//when
memberService.save(member1);
Long savedToDoId = toDoService.save(toDo);
Optional<ToDo> findToDo = toDoService.findById(savedToDoId);
Member findMember = findToDo.get().getMember();
//then
assertThat(savedToDoId).isEqualTo(toDo.getId());
assertThat(findMember).isEqualTo(member1);
}
ToDo의 Member를 지연로딩으로 설정했기에 프록시를 사용하여 접근하므로 @Transaction 사용.
ToDo의 저장 여부와 Member 동일성 여부 확인. (영속성 컨텍스트의 동일성 보장)
ToDo 삭제 기능 테스트
class ToDoRepositoryTest {..
@Test
public void delete() throws Exception {
//given
Member member1 = new Member("222", "456", "member1");
ToDo toDo = ToDo.createToDo("title", "description", null, member1);
memberService.save(member1);
Long savedToDoId = toDoService.save(toDo);
//when
toDoService.delete(toDo);
//then
Optional<ToDo> findToDo = toDoService.findById(savedToDoId);
assertThat(findToDo.isEmpty()).isTrue();
}
ToDo 수정 기능 테스트
class ToDo {..
public void update(String title, String description, LocalDate dueDate) {
this.title = title;
this.description = description;
this.dueDate = dueDate;
}
..
}
class ToDoServiceImpl implements ToDoService {..
@Override
@Transactional
public void update(Long id, String title, String description, LocalDate dueDate) {
Optional<ToDo> toDo = repository.findById(id);
toDo.ifPresent(t -> t.update(title, description, dueDate));
}
@Override
@Transactional
public void changeStatus(Long id) {
Optional<ToDo> findToDo = repository.findById(id);
findToDo.ifPresent(toDo -> toDo.changeStatus());
}
}
Optional.ifPresent() : Optional의 객체가 존재할 때(!null) ifPresent()안의 로직을 실행
class ToDoRepositoryTest {..
@Test
public void update() throws Exception {
//given
Member member1 = new Member("333", "456", "member1");
ToDo toDo = ToDo.createToDo("title", "description", null, member1);
memberService.save(member1);
Long savedToDoId = toDoService.save(toDo);
//when
toDoService.update(savedToDoId, "new title", "new description",
LocalDate.of(2023, 11, 9));
toDoService.changeStatus(savedToDoId);
//then
Optional<ToDo> findToDo = toDoService.findById(savedToDoId);
assertThat(findToDo.map(t -> t.getTitle()).orElse("")).isEqualTo("new title");
assertThat(findToDo.map(t -> t.getDescription()).orElse("")).isEqualTo("new description");
assertThat(findToDo.map(t -> t.getDueDate()).orElse(null)).isEqualTo(
LocalDate.of(2023, 11, 9)
);
assertThat(findToDo.map(t -> t.getIsCompleted()).orElse(false)).isTrue();
}
}
ToDo의 변경사항이 잘 적용 되었음.
프로젝트의 핵심 로직을 모두 개발했으니 이제 Controller와 Web계층(Html) 개발을 시작하겠습니다.