본문 바로가기

개발

로그인 테스트 에러 (T-001)

반응형

앞선 포스팅에서는 굉장히 합리적인 이유로(귀찮은 일 하기 싫어서..ㅎ) 테스트를 간추리고 간추렸다

이제 개발해야할 부분이라고는 고작 아래와 같이 몇가지가 남아있었다

1. 레포지토리를 이용해 계정을 등록하기

2. 이때 트랜잭션 이용해서 valid한 계정인거 그냥 셋해버리기

3. mockMvc로 post 요청 보내기

4. 이때 csrf토큰 생성해서 담아주기(이미 어떻게 pssing 하는지 미리 좀 알아 봤지..ㅎ 나 좀 꼼꼼함요ㅋ)

 

    @Test
    @DisplayName("계정을 등록 후, 로그인 시 정상적으로 동작")
    @Transactional
    public void loginTest() throws Exception{
        Account account = Account.builder()
                .email("asd@email.com")
                .password("123456789")
                .nickname("kim")
                .build();

        Account savedAccount = accountRepository.save(account);
        savedAccount.setEmailVerified(true);

        mockMvc.perform(post("/login")
                .param("username", "asd@email.com")
                .param("password", "123456789")
                .with(csrf())
        ).andExpect(authenticated().withUsername("kim"));
    }

위와 같이 테스트를 개발했고 실행했다

 

(실행 결과)

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"

 

정말 눈을 의심하는 상황이 발생..

너무 놀라서 에러 메세지 읽지도 않고 바로 유저네임패스워드 필터에 브레이크 걸고 디버그까지 했다...(당연히 여기는 정상적으로 동작)

 

차분하게 에러 메세지를 읽어보고 문제를 인지했다

패스워드 인코더가 없다라는 정보를 읽고 계정 정보를 어디서 save하는지 체크했다

테스트 코드에서는 레포지토리 레이어에서 계정 정보를 save하는데 패스워드 인코더는 서비스 레이어에서 동작하다보니,

디비에 저장된 패스워드가 정말 플레인하게 저장된 사실을 관찰했다

이를 고쳐 해결했다

 

결론

컨트롤러 레이어를 이용해 테스트를 진행하는데 귀찮은 나머지 레포지토리를 이용해 직접 save하던게 원인이었다

이렇게 스킵하는 과정에서 스킵되면 안되는 과정이 있었고, 때문에 2시간 남짓 허비했다...

커밋 로그: d85cc5b880e1fbee8817c3d6ab8c4cfea74c4723

반응형

'개발' 카테고리의 다른 글

1차 개발 후기 (T-001)  (0) 2022.03.08
로그인 테스트 (T-001)  (0) 2022.02.26
이메일 회원가입 기능 - 3 (T-001)  (0) 2022.02.24
2022년 2월 23일 T-001 개발 일기  (0) 2022.02.24
이메일 회원가입 기능 - 2 (T-001)  (0) 2022.02.23