오봉이와 함께하는 개발 블로그

Spring - 테스트 코드 작성시 NPE 본문

BE/Spring

Spring - 테스트 코드 작성시 NPE

오봉봉이 2022. 7. 22. 20:02
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
Comments