delivery - member testcode

송민지·2024년 9월 24일

member의 service testcode를 작성하면서 나타난 에러 기록입니다.

this.JwtUtill is null

@InjectMocks으로 jwtUtil을 주입하였습니다.

하지만 바로 다른 에러가 나타났습니다. 콘솔에 찍힌 에러는 this.JwtUtill is null로 끝났지만, 디버그로 확인한 결과 key값이 null인것을 확인하였습니다.

원인은 JwtUtil에서 key를 만들때 사용하는 @PostConstruct 때문이였습니다.
@PostConstruct는

  1. 의존성 주입이 완료된 후에 실행되어야 하는 method에 사용되며

  2. 해당 어노테이션은 다른 리소스에서 호출되지 않아도 수행됩니다.

  3. 생성자 보다 늦게 호출됩니다.

    testcode에서는 의존성이 주입되지 않았기 때문에, @PostConstruct는 동작하지 않았습니다. 따라서 별도로 jwt seceret key값을 넣어주어야 합니다.

ReflectionTestUtils.setField(jwtUtil,"secretKey","7ZWt7ZW0OTntmZTsnbTtjIXtlZzqta3snYTrhIjrqLjshLjqs4TroZzrgpjslYTqsIDsnpDtm4zrpa3tlZzqsJzrsJzsnpDrpbzrp4zrk6TslrTqsIDsnpA=");
        jwtUtil.init();

그러자 다른 에러가 나타났습니다.

because this.repository is null

구글링으로 찾아본 결과 대부분 어노테이션을 빼먹어 발생한 문제여서 저에게는 맞지 않는 해결책이였습니다.

결국 memberService에 직접 주입해 주었습니다.

response is null

delivery memberService는 로그인할때 SignInDto와 HttpSevletResponse를 매개변수로 받고있습니다.
HttpSevletResponse를 실제로 동작하듯이 사용자가 설정한 대로 동작하도록 하기 위해 @Spy를 붙여주었습니다.

encodedPassword = null

모든 testcode가 제대로 작동하는지 확인한 결과 login test가 비밀번호 불일치 에러 메세지를 보내는 것을 확인하였습니다.

@Mock
private PasswordEncoder passwordEncoder;

으로 되어있는 부분을

@Spy
private PasswordEncoder passwordEncoder;

로 바꾸어 해결하였습니다.


Spring Boot에서 @PostConstruct 알아보자!

profile
항상 밝게

0개의 댓글