작성
·
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>로 변경해서 테스트 로직을 성공하긴했습니다...
질문
UserRepository의 Optional<Member>를 변경하지 않고 테스트 코드를 작성하는 방법이 있을까요??
Optional에서 List로 변경했을 때 문제점은 없을까요?
답변 3
1
원인을 찾았습니다 -,.-;
userRepository에 대한 delete.all을 하지 않아서 JPA 쿼리 에러가 뜨는거였네요........
괜한 곳에서 원인을 찾고 있었습니다.....
죄송합니다 선생님 해결했습니다 ㅠ_ㅠ...
0
강의를 쭉 다시 들어보면서 테스트케이스를 돌렸는데요
PostControleerTest에서 인증테스트 메서드를 만들어서 돌렸을 때랑 따로 AuthControllerTest를 만들어서 했을 때랑 결과가 다르게 나오네여 -,-;;;
동일한 테스트케이스 코드인데 결과가 다르다니 뭔가 신기하네여...
0