오봉이와 함께하는 개발 블로그
Spring - 테스트 코드 작성시 NPE 본문
728x90
문제
패스워드를 암호화 해서 저장하고, 평문 패스워드로 일치하는지 여부를 검사하는 테스트였는데, 어떻게 테스트 코드를 작성 해도 NPE(NullPoint Exception)가 지속적으로 발생했다.
작성했던 코드들
1번
class MemberServiceImplTest {
WebSecurityConfig webSecurityConfig = new WebSecurityConfig();
EntityManager em;
MemberRepository memberRepository = new MemberRepositoryImpl(em, webSecurityConfig);
MemberService memberService = new MemberServiceImpl(memberRepository);
@Test
@DisplayName("패스워드 암호화 로그인")
public void validPasswordTest() {
// given
Member member = new Member();
member.setId("test");
member.setPassword(webSecurityConfig.getPasswordEncoder().encode("1234"));
memberService.join(member);
// when
Member findMember = memberService.validLogin("test", "1234");
// then
Assertions.assertThat(findMember).isNotNull();
}
}
java.lang.NullPointerException
at bear.blog.repository.MemberRepositoryImpl.findById(MemberRepositoryImpl.java:30)
at bear.blog.service.MemberServiceImpl.validateDuplicateMemberId(MemberServiceImpl.java:41)
at bear.blog.service.MemberServiceImpl.join(MemberServiceImpl.java:23)
at bear.blog.service.MemberServiceImplTest.validPasswordTest(MemberServiceImplTest.java:39)
... 이하 생략
webSecurityConfig는 패스워드 암호화를 담당하는 클래스, 그리고 Repository와 Service의 구현체들을 객체로 만들어 실행한 코드다.
여기서 어떤 문제가 있는지 알 수 있는 사람도 있겠지만 마지막에 어떻게 해결했는지 적어보도록 하겠다.
2번
class MemberServiceImplTest {
WebSecurityConfig webSecurityConfig;
MemberService memberService;
@Test
@DisplayName("패스워드 암호화 로그인")
public void validPasswordTest() {
// given
Member member = new Member();
member.setId("test");
member.setPassword(webSecurityConfig.getPasswordEncoder().encode("1234"));
memberService.join(member);
// when
Member findMember = memberService.validLogin("test", "1234");
// then
Assertions.assertThat(findMember).isNotNull();
}
}
java.lang.NullPointerException
at bear.blog.service.MemberServiceImplTest.validPasswordTest(MemberServiceImplTest.java:36)
... 이하 생략
암호화를 담당하는 클래스에서부터 문제가 발생했다.
@Autowired
WebSecurityConfig webSecurityConfig;
@Autowired
MemberService memberService;
위 코드에 @Autowired 어노테이션을 추가했지만 똑같은 오류가 발생했다.
3번
class MemberServiceImplTest {
WebSecurityConfig webSecurityConfig = new WebSecurityConfig();
@Autowired
MemberService memberService;
@Test
@DisplayName("패스워드 암호화 로그인")
public void validPasswordTest() {
// given
Member member = new Member();
member.setId("test");
member.setPassword(webSecurityConfig.getPasswordEncoder().encode("1234"));
memberService.join(member);
// when
Member findMember = memberService.validLogin("test", "1234");
// then
Assertions.assertThat(findMember).isNotNull();
}
}
java.lang.NullPointerException
at bear.blog.service.MemberServiceImplTest.validPasswordTest(MemberServiceImplTest.java:39)
... 이하 생략
이번엔 Service에서 NPE가 발생했다.
해결 방법
해결 방법은 매우 간단했다.
EntityManager를 사용하는 Service였는데 EntityManager는 Spring에서 동작한다.
그렇기 때문에 @SpringBootTest 어노테이션을 추가하면 정상 실행이 된다.
@SpringBootTest
@Transactional
class MemberServiceImplTest {
@Autowired
WebSecurityConfig webSecurityConfig;
@Autowired
MemberService memberService;
@Test
@DisplayName("패스워드 암호화 로그인")
public void validPasswordTest() {
// given
Member member = new Member();
member.setId("test");
member.setPassword(webSecurityConfig.getPasswordEncoder().encode("1234"));
memberService.join(member);
// when
Member findMember = memberService.validLogin("test", "1234");
// then
Assertions.assertThat(findMember).isNotNull();
}
}
느낀점
매우 기본적인 문제 때문에 몇 시간을 고민하고 또 찾았는지 기억도 안 난다.
하다 하다 결국 포기하고 테스트 코드 없이 실제로 작동 확인을 했었다.
이 경험 덕분에 기본부터 충실하자는 교훈을 얻었다. 😭
728x90
'BE > Spring' 카테고리의 다른 글
스프링 MVC 1 - 핸들러 매핑과 핸들러 어댑터 (0) | 2022.08.12 |
---|---|
스프링 MVC 1 - 스프링 MVC 구조 (0) | 2022.08.12 |
Spring - SpringSecurity 사용해서 패스워드 암호화 하기 (0) | 2022.07.19 |
Spring - 빈 스코프(스코프와 Provider, 스코프와 프록시) (0) | 2022.06.13 |
Spring - 빈 스코프(웹 스코프, request 스코프 예제 만들기) (0) | 2022.06.13 |
Comments