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

HH님의 프로필 이미지
HH

작성한 질문수

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

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

findByName() 테스트 시 NoSuchElementException 에러

작성

·

522

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)


2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)


3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)



[질문 내용]
안녕하세요 강의 잘 보고 있습니다 ㅎㅎ

다름이 아니라 저는 getter와 setter를 따로 작성하지 않고 Lombok을 이용해서 getter, builder 어노테이션으로 getter와 setter를 생성했는데요

save() 테스트는 정상적으로 통과하지만

findByNmae() 테스트 시에는 아래와 같은 오류가 발생합니다.

그리고 아래 처럼 get() 메서드에 노란 점선이 표시되며

옆에 이상한 문구가 뜨는데 lombok을 사용해서 발생한 오류일까요 ??

스프링 부트 버전은 강의와 똑같이 2.3.1 버전을 사용중이며

각 클래스별 코드는 아래와 같습니다.

  • Member

package com.example.hellospring.domain;

import lombok.Builder;
import lombok.Getter;

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

    @Builder
    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}

 

  • MemberRespository

package com.example.hellospring.repository;

import com.example.hellospring.domain.Member;

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

public interface MemberRepository {
    // 회원 저장
    Member save(Member member);
    // id로 회원 찾기
    Optional<Member> findById(Long id); // Optional 타입은 값이 Null일 때 null 반환
    // name으로 이름 찾기
    Optional<Member> findByName(String name);
    // 전체 찾기
    List<Member> findAll();
}

 

  • MemoryMemberRepository

package com.example.hellospring.repository;

import com.example.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository {
    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        Member.builder()
                .id(++sequence)
                .build();
        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());
    }
}

 

 

 

답변 1

0

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

public class MemoryMemberRepository implements MemberRepository {
    //...

    @Override
    public Member save(Member member) {
        Member.builder()
                .id(++sequence)
                .build();
        store.put(member.getId(), member);
        return member;
    }

    //...
}

해당 부분에서 문제가 2개 존재합니다.

1) sequence가 저장되지 않습니다. 왜냐하면 Member.builder().build()를 통해 다른 member 인스턴스를 생성해주시기 때문입니다.
2) 1)의 결과로 id가 null인 member 객체를 저장하고 있습니다.

기존 코드로 save()쪽을 디버깅해서 member가 정상적으로 저장되는 지 보시고 위의 save() 코드를 적절하게 바꿔주시기 바랍니다.


감사합니다.

HH님의 프로필 이미지
HH

작성한 질문수

질문하기