멍청멍청기록/에러 일기

JPA 에러] JPA 테스트 케이스 에러

  • -
728x90
반응형

작성한 코드

public interface MemberRepository extends CrudRepository<Member, Long> {
    Optional<Member> findByEmailAndPassword(String email, String password);
}
@Service
@RequiredArgsConstructor
public class AuthService {

    private final MemberRepository memberRepository;

    public Member signin(Login login) {
        Member member = memberRepository.findByEmailAndPassword(login.getEmail(), login.getPassword())
                .orElseThrow(InvalidSign::new);
        return member;
    }
}

 

테스트 코드

@Test
    @DisplayName("인증 테스트")
    void test11() throws Exception {
        // given
        Member member = Member.builder()
                .email("abc@naver.com")
                .password("1234")
                .build();

        memberRepository.save(member);

        Login login = Login.builder()
                .email("abc@naver.com")
                .password("1234")
                .build();

        String json = objectMapper.writeValueAsString(login);

        // expected
        mockMvc.perform(
                        post("/auth/login")
                                .contentType(APPLICATION_JSON)
                                .content(json))
                .andExpect(status().isOk())
                .andDo(print());
    }

 

에러 메시지

query did not return a unique result: 2;
nested exception is javax.persistence.NonUniqueResultException: 
query did not return a unique result: 2

 

원인

JPA class를 List로 변경해라

 

참고 블로그 : https://wakestand.tistory.com/943

 

JPA query did not return a unique result 에러 해결방법

query did not return a unique result: 3 JPA에서 조회 사용 시 위와 같은 에러가 발생하는 경우는 Repository 부분을 확인해주면 되는데 조회 결과는 3건이 나왔지만 Repository에서 Return을 Class로 받았기 때문에

wakestand.tistory.com

 

반전

당연히 원인이 MemberRepository의 Optional인 줄 알고 블로그에 나오는 것 처럼 List로 작성 후 Service단도 변경 했다

 

변경된 코드

    public List<Member> signin(Login login) {
        List<Member> memberList = Optional.ofNullable(memberRepository.findByEmailAndPassword(login.getEmail(), login.getPassword()))
                .orElseThrow(() -> new InvalidSign());
        return memberList;

 

하지만 뭔가 이상해서 곰곰히 생각하는 중에 인증 테스크 케이스만 다른 class에 빼서 실행을 했는데 정상적으로 작동을 하는 것이다?

알고보니....

원래 테스트 클래스를 작성하는 곳에서 MemberRepository에 대한 delete.all()을 해주지 않아서 계속 JPA 쿼리 실패 에러가 뜨는 것이 었다..

 

깨달은 것

1. 별도의 기능 테스트는 무조건 따로 분류해서 작성한다.

2. 테스트 케이스는 어렵다.

3. JPA 관련 공부를 천천히 다시 해본다.

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.