인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

jangso825님의 프로필 이미지
jangso825

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 서비스 테스트

중복회원예외에서 assertThrows

작성

·

567

0

assertThrows에서 오류가 생기는데 이를 해결할 방법을 알려주시길 부탁드립니다

<Memberservice>

package hello.hellospring1.service;

import hello.hellospring1.repository.MemoryMemberRepository;
import hello.hellospring1.repository.MemberRepository;
import hello.hellospring1.domain.Member;

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

public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
    /**
     * 회원가입
     */
    public Long join(Member member){
        //같은 이름이 있는 중복 회원은 x
        validateDuplicateMember(member);
        //optional으로 한번 감싸면 optional안에 member객체가 있는거
        //옛날에는 ifnull 지금은 optional로 감싸기
        //optional로 바로 반환하는거는 추천x
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName()) //ctrl+alt+v
                   .ifPresent(m -> { //result가 null이 아니면 즉, 값이 있으면 동작
                               throw new IllegalStateException("이미 존재하는 회원입니다.");
                           });
    }

    /**
     * 전체 회원 조회
     */

    public List<Member> findMember() {
        return memberRepository.findAll();
    }

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

<MemberServiceTest> -> 중복_회원_예외에서 오류 발생

package hello.hellospring1.service;

import hello.hellospring1.domain.Member;
import hello.hellospring1.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

//import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
//import static org.assertj.core.api.Assertions.*;



class MemberServiceTest {
//test코드는 실제 코드에 포함 되지 않음
    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }

    @Test
    void 회원가입()  {
        //given -> 이런게 주어지면 (이 데이터를 기반으로 하는 구나)
        Member member = new Member();
        member.setName("hello");
        //when -> 이게 주어졌을 떄 (이걸 검증하는 구나)
        Long saveId = memberService.join(member);

        //then -> 이렇게 실행 되어야 돼(여기가 검증부구나)
//        Member findMember = memberRepository.findById(saveId).get();
//        assertEquals(member.getName(), findMember.getName());
        Member findMember = memberService.findOne(saveId).get();

        Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    //test는 정상도 중요한데 예외도 중요함
    @Test
    public void 중복_회원_예외() {
        //given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        //when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, ()->memberService.join(member2));

        Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        /*       try {
            memberService.join(member2);
            fail();
        } catch (IllegalStateException e){
            Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

        }

  */
        //then

    }

<오류 화면>

답변 2

1

안녕하세요. jangso825님, 공식 서포터즈 OMG입니다.

 

package hello.hellospring1.domain;

public class Member {
private Long id;
private String name;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

 

 

package hello.hellospring1.repository;

import hello.hellospring1.domain.Member;

import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;

public class MemoryMemberRepository implements MemberRepository {

private static final Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L; //long보다는 autom long을 해야됨



@Override
public Member save(Member member) {
member.setId(++sequence); //아이디 세팅
store.put(member.getId(),member); //아이디 저장
return member;
}

@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}

@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}

@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}



public void clearStore(){
store.clear();
}

@Override
public Optional<Member> findId(Long memberId) {
return Optional.empty();
}
}

 

 

package hello.hellospring1.repository;

import hello.hellospring1.domain.Member;

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

public interface MemberRepository {
public Member save(Member member);
public Optional<Member> findById(Long id);
public Optional<Member> findByName(String name);
public List<Member> findAll() ;
public Optional<Member> findId(Long memberId);

}

 

package hello.hellospring1.service;
import hello.hellospring1.repository.MemoryMemberRepository;
import hello.hellospring1.repository.MemberRepository;
import hello.hellospring1.domain.Member;

import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository;

public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
/**
* 회원가입
*/
public Long join(Member member){
//같은 이름이 있는 중복 회원은 x
validateDuplicateMember(member);
//optional으로 한번 감싸면 optional안에 member객체가 있는거
//옛날에는 ifnull 지금은 optional로 감싸기
//optional로 바로 반환하는거는 추천x
memberRepository.save(member);
return member.getId();
}

private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName()) //ctrl+alt+v
.ifPresent(m -> { //result null이 아니면 즉, 값이 있으면 동작
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}

/**
* 전체 회원 조회
*/

public List<Member> findMember() {
return memberRepository.findAll();
}

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

 

package hello.hellospring1.service;

import hello.hellospring1.domain.Member;
import hello.hellospring1.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

//import java.util.Optional;

import static org.junit.jupiter.api.Assertions.*;
//import static org.assertj.core.api.Assertions.*;



class MemberServiceTest {
//test코드는 실제 코드에 포함 되지 않음
MemberService memberService;
MemoryMemberRepository memberRepository;

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

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

@Test
void 회원가입() {
//given -> 이런게 주어지면 (이 데이터를 기반으로 하는 구나)
Member member = new Member();
member.setName("hello");
//when -> 이게 주어졌을 떄 (이걸 검증하는 구나)
Long saveId = memberService.join(member);

//then -> 이렇게 실행 되어야 돼(여기가 검증부구나)
// Member findMember = memberRepository.findById(saveId).get();
// assertEquals(member.getName(), findMember.getName());
Member findMember = memberService.findOne(saveId).get();

Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}

//test는 정상도 중요한데 예외도 중요함
@Test
public void 중복_회원_예외() {
//given
Member member1 = new Member();
member1.setName("spring");

Member member2 = new Member();
member2.setName("spring");

//when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

Assertions.assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");

}
}

 

올리신 코드 복사-붙여넣기 하여 확인해봤는데 정상작동 확인하였습니다.

프로젝트를 새로 생성하여 제가 올린 코드 복붙하여 확인해보시겠어요?

 


감사합니다.

 

 

0

안녕하세요, jangso825 님! 공식 서포터즈 codesweaver 입니다.

memberRepository.findByName() 에서 제대로 된 반환값을 찾을 수 없어 오류가 나는 것으로 보이는데요

MemberRepository 코드도 올려주시기 바랍니다.

감사합니다.

jangso825님의 프로필 이미지
jangso825
질문자

package hello.hellospring1.repository;

import hello.hellospring1.domain.Member;

import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;

public class MemoryMemberRepository implements MemberRepository {

    private static final Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L; //long보다는 autom long을 해야됨



    @Override
    public Member save(Member member) {
        member.setId(++sequence); //아이디 세팅
        store.put(member.getId(),member); //아이디 저장
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }



    public void clearStore(){
        store.clear();
    }

    @Override
    public Optional<Member> findId(Long memberId) {
        return Optional.empty();
    }
}

<memberRepository>입니다.

만약 말씀하시는 부분이 아니라면 바로 수정하겠습니다. 자세한 답변 감사합니다. 

jangso825님의 프로필 이미지
jangso825

작성한 질문수

질문하기