본문 바로가기
Spring/Spring

[inflearn / spring 입문] 테스트 케이스 작성(*) + service

by SIXXXX_ 2022. 2. 13.
728x90

spring >> JUnit 이라는 프레임 워크로 테스트를 실행한다.

 

쓰이는 단축키(window)

  • alt + enter : add import
  • shift + F6 : name 변경
  • Ctrl+Alt+Shift+ T : refactor

 

 

.get() : optional 꺼내 사용시 작성

원래는 result 대신 null 값 입력시

 

 

테스트 메서드작성 완료후에 전체 클래스 실행하면

 

  • 메서드 순서대로 실행되는게 아니라 repository에 이름값인 member들이 남아있어 에러 발생
  • 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다. 이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다. @AfterEach 를 사용하면 각 테스트가 종료될 때 마다 이 기능을 실행한다. 여기서는 메모리 DB에 저장된 데이터를 삭제한다.

 

주의사항 : 테스트는 각각 독립적으로 실행되어야 한다. 테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.

 

 

 

해결방안 ) 

TEST.class 안에 repository 만들어줄때 밑에 @AfterEach(){}도 작성해주기 
테스트할 클래스 안에 작성

이러한 방법으로 테스트 케이스를 만든다

 

 

우리가 했던 클래스 작성 후 테스트 케이스 만들기 순을 반대로 하는 경우 테스트 주도 개발(일명 'TDD')라고 한다.

실무에서 코드가 굉장히 많을 경우에 테스트할게 많아지는데 build test하거나 run test하거나 gradle.test 해보거나 3가지 정도의 방법을 쓴다.(검색하기)

 

테스트거리가 많을 경우 방법

 

 

 

service 작성

 

package welcome.welcomespring.service;

import welcome.welcomespring.domain.Member;
import welcome.welcomespring.repository.MemberRepository;
import welcome.welcomespring.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    /**
     * 회원가입
     * @param member
     * @return
     */
    public Long join(Member member) {
        // 같은 이름이 있는 중복 회원 x
        // Optional<Member> result = memberRepository.findByName(member.getName());
        // result.ifPresent(m -> {//값이 있다면 null이 아니라면 optional로 감싸서 사용가능 메소드가 있는 것
        //result.orElseGet() 사용해서 꺼내는 방법 >> 값이 있다면 꺼내고 없다면 default값을 꺼내~
        validateDuplicateMember(member); //중복회원검증(refactor)
        memberRepository.save(member);
        return member.getId();

    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                       throw new IllegalStateException("이미 존재하는 회원입니다.");
                 });
    }

    /**
     * 전체회원 조회
     * @return
     */
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}

주의사항 : repository는 보통 그냥 작성해도 service는 비즈니스에 가깝게 작명해야된다!!