개발공부/[spring]김영한_스프링입문

[1]회원 관리 예제 - 백엔드 개발[테스트 코드 작성,서비스와 리포지토리]

개발자 덕구🐾 2022. 7. 14. 22:46
728x90

 

서비스 : 핵심 비즈니스 로직 구현

리포지토리 : 데이터베이스에 접근 

도메인 : 비즈니스 도메인 객체 

 

 

 

 

단축키 : 

작성한 코드를 별도의 메서드로 만드려면 단축키는? (메서드 추출) : Ctrl + Alt + m 

테스트 파일을 쉽게 만드는 단축키는 ? : Ctrl + shift + t 

게터,세터,생성자 단축키는? : alt + insert 

반환형 만든는 단축키는? : ctrl + alt + v 

rename을 쉽게 도와주는 단축키는? shift + f6

 

 

 

 

 

1 . 회원 리포지토리 테스트 케이스 작성 

 

 

테스트 케이스 작성 중 Assertions.assertThat에서 에러가 발생하였다. 

질문 게시판에서 이유를 발견할 수 있었다. 

Assertion에는 import할 수 있는 2가지가 있다. 

 

 

강사님께서는 assertj.core.api.Asserions; 를 import하였고 나는 다른 Assertions를 import하여 에러가 발생한 것이었다. 

 

질문게시판에서 발견한 해답

 

    @Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("spring1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("spring2");
        repository.save(member2);

        Member result = repository.findByName("spring1").get();

        Assertions.assertThat(result).isEqualTo(member1);

    }

 

이런 식으로 @Test 어노테이션을 이용해 코드를 테스트 할 수 있다. 

지금까지 개발할 때는 postman을 이용하였는데 이렇게 하면 훨씬 빠르고 쉽게 할 수 있을것같다.

 

 

 

 

테스트는 순서를 보장하지 않고 랜덤으로 실행이 된다. (의존관계 없이 설계가 되어야한다.)

그래서 실행되는 순서에 따라 데이터가 남아있어 문제를 발생시킬 수 있다. 

이를 방지하기 위해 test가 끝날 때마다 data를 clear해주어야한다. 

 

 

    @AfterEach
    public void afterEach(){
        repository.clearStore();
    }

를 작성하면 된다. 

 

이러한 테스트 코드를 먼저 만드는 것이 TDD 테스트 주도 개발이라고 한다. 

 

 

 


 

2 . 회원 서비스 테스트  

 

 

service에서 이용하는 리포지토리와 테스트에서 사용하는 리포지토리가 서로 다르다.

같은 인스턴스를 사용하도록 변경해야한다.

 

 

 

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

 

    MemberService memberService;
    MemoryMemberRepository memoryMemberRepository;

    @BeforeEach
    public void beforeEach(){
        memoryMemberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memoryMemberRepository);
    }

 

 

이렇게 memberService입장에서 직접 리포지토리를 만드는 것이 아니라 외부에서 넣어준다. 

이를 DI(Dependency Injection)라고 한다. 

 

반응형