Spring Example: ToDo List #3 테스트 코드 작성

함형주·2022년 9월 18일
0

Spring Example: ToDo

목록 보기
4/16

질문, 피드백 등 모든 댓글 환영합니다!

지난 시간에 개발한 Entity,Repository, Service가 정상 동작하는지 테스트 코드를 작성해보겠습니다.
테스트는 JUnit5를 사용했습니다.

annotation

@SpringBootTest : 스프링 통합 테스트 기능 제공
@Autowired : 등록된 스프링 빈 중 적절한 객체를 주입해 줌.
@Test : 단위 테스트 기능 제공

++ 추가로 org.assertj.core.api.Assertions.assertThat을 static으로 import 했습니다.

MemberRepositoryTest

회원 저장 기능 테스트

@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가 둘 다 맞을 시 로그인 성공

ToDoRepositoryTest

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 수정 기능 테스트

ToDo update()추가

class ToDo {..
	
    public void update(String title, String description, LocalDate dueDate) {
        this.title = title;
        this.description = description;
        this.dueDate = dueDate;
    }
	..
}

ToDoService, ToDoServiceImpl 수정

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) 개발을 시작하겠습니다.


github , 배포 URL (첫 접속 시 로딩이 걸릴 수 있습니다.)

profile
평범한 대학생의 공부 일기?

0개의 댓글