inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

회원 서비스 테스트

중복회원예외에서 assertThrows

612

jangso825

작성한 질문수 2

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

    }

<오류 화면>

spring-boot MVC java spring

답변 2

1

OMG

안녕하세요. 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 코드도 올려주시기 바랍니다.

감사합니다.

0

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>입니다.

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

인텔리제이 오류

0

40

1

..

0

103

2

Unused property.....

0

116

2

project JDK is misconfigured

0

157

2

외부 API의 ID 타입(String/UUID)과 내부 도메인의 ID 타입(Long)이 불일치할 때의 설계 정석

0

97

2

단위/통합 테스트 버전충돌 문제

0

97

2

❗️springboot 4.0.2 버전 aspectj dependency 설정❗️

0

246

1

왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?

0

116

2

윈도우 build test오류 질문

1

115

2

테스트 관련 공부에 대한 조언을 얻고 싶습니다

0

108

2

테스트 실행 시 에러 질문

0

306

1

name을 통한 비교와 객체를 통한 비교

0

79

1

빌드 후 libs 없음

1

142

1

윈도우 gradlew.bat 에러

0

179

1

@PostMapping("/members/new")가 동작하지 않습니다

0

97

1

java static class와 kotlin class

0

87

1

스프링 DB연결

0

140

1

소요 시간

0

96

2

ddl.sql에 빨간 밑줄

1

112

2

welcome page 에러

0

195

3

잘 모르겠습니다.

0

170

2

fail을 똑같이 쳤는데 오류가 발생해요

0

169

2

index.html Welcome page

0

133

1

프로젝트 gradle-groovy ?

0

396

1