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

최하준님의 프로필 이미지

작성한 질문수

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

세션토큰 발급기능 추가

[해결완료] 로그인 인증 테스트코드 작성 질문입니다

작성

·

768

·

수정됨

0

안녕하세요 호돌맨 선생님!

세션토큰 발급기능 추가를 초반에 보다가 로그인 관련 테스트를 직접 작성해보라고 하셔서 해봤는데 궁금한 점이 있어서 질문드립니다!

작성한코드

@Test
@DisplayName("인증 테스트")
void test11() throws Exception {
    // given
    Member member = Member.builder()
            .email("abc@naver.com")
            .password("1234")
            .build();
    // UserRepository를 MemeberRepository로 이름 변경 했습니다.
    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 에러라는 것을 검색을 통해서 알았습니다

해결 방법 블로그 주소 : https://wakestand.tistory.com/943

UserRepository에 작성한 findByEmailAndPassWord 메서드가 Optional로 되어 있는데 이 부분을 List로 변경해야할 것 같아서 다음과 같이 변경했습니다

 

변경된 코드

UserRepository

public interface MemberRepository extends CrudRepository<Member, Long> {
    List<Member> findByEmailAndPassword(String email, String password);
    
}

AuthService

@Service
@RequiredArgsConstructor
public class AuthService {

    private final MemberRepository memberRepository;

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

위 처럼 Optional<Member가 아닌 List<Member>로 변경해서 테스트 로직을 성공하긴했습니다...

 

 

질문

  1. UserRepository의 Optional<Member>를 변경하지 않고 테스트 코드를 작성하는 방법이 있을까요??

  2. Optional에서 List로 변경했을 때 문제점은 없을까요?

     

답변 3

1

최하준님의 프로필 이미지
최하준
질문자

원인을 찾았습니다 -,.-;

userRepository에 대한 delete.all을 하지 않아서 JPA 쿼리 에러가 뜨는거였네요........

괜한 곳에서 원인을 찾고 있었습니다.....

죄송합니다 선생님 해결했습니다 ㅠ_ㅠ...

0

최하준님의 프로필 이미지
최하준
질문자

강의를 쭉 다시 들어보면서 테스트케이스를 돌렸는데요
PostControleerTest에서 인증테스트 메서드를 만들어서 돌렸을 때랑 따로 AuthControllerTest를 만들어서 했을 때랑 결과가 다르게 나오네여 -,-;;;

동일한 테스트케이스 코드인데 결과가 다르다니 뭔가 신기하네여...

0

최하준님의 프로필 이미지
최하준
질문자

생각해보니 로그인은 한명이라서 굳이 List로 쓸 필요는 없겠네요...흑... 테스트 코드 작성하는 방법을 다시 생각해보겠습니다..