Error

[Spring] test코드 실행 시 NullPointerException 발생 (Serivce 증명시)

WOOOOJI 2023. 3. 17. 19:12

NPE(NullPointerException) 

null 값을 참조할 경우 발생시키는 예외이다. 개발자가 두려워 하는 에러 중 하나.

 

 

 

 

상황은 이러하다.
Service클래스에서 만든 JPA를 활용한 DB접근 메소드를 검증하고자, test클래스를 만들어 실행 시켰다.
자세한 코드는 다음과 같다.







Service

@Service
public class UserService {

    @Autowired
    UserRepository userRepository;


    public Long join(User user){
        userRepository.save(user); // JpaRepository 메소드 활용
        return user.getId();
    }

 


 

Test

class UserServiceTest {

    @Autowired
    UserService userService;
    @Test
    void join() {
        User user = User.builder().id(2L).name("woojin").build();
        assertThat(userService.join(user)).isEqualTo(2L);
    }

 

 

 

Result

 

 


 

역추적으로 null인 부분을 찾고자 했지만 모든 필드는 초기화가 잘 되있었다....

 

 

그렇다. 여기서 눈 여겨 볼점은 user라는 객체안에 있는 필드가 null이여서 발생한 오류가 아닙니다.

user라는 객체 자체가 null이라는 뜻입니다 !

왜 이러한 에러가 발생하였을까...? Builder패턴을 사용하는데 내가 고려하지 못한 부분이 존재한건가?..........

정답은 간단간단 쏘 간단했습니다.

 

class UserServiceTest {

    @Autowired
    UserService userService;
    @Test
    void join() {
        User user = User.builder().id(2L).name("woojin").build();
        assertThat(userService.join(user)).isEqualTo(2L);
    }

위 코드에서 이상한 점은?

@SpringBootTest
class UserServiceTest {

 

@SpringBootTest 어노테이션을 쓰지 않았다............하.........

인텔리제이 툴을 사용하여 "테스트 생성"을 눌러서 클래스를 생성하다보니 @SpringBootTest가 명시가 안되있을거라고는 상상도 못했다.

얼마전까지만 해도 이클립스를 쓰다가 넘어와서 그런지 정말 황당한 실수를 했다...

 

 

@SpringBootTest는

단위 테스트와 같이 기능 검증을 위한 것이 아니라 spring framework에서 전체적으로 플로우가 제대로 동작하는지 검증하기 위해 사용 한다. 그래서 Spring Container가 돌아가지 않아서 @Autowired가 안된것이다. 명시하지 않으면 @Service가 명시된 Bean를 사용하고자 해도 생성이 안되있기에 불가능하다.

즉 User를 생성하는 과정에선 문제가 없었지만 Serivce객체를 사용하는 과정에서 NPE가 발생한거였다 ^^

 

 

 

728x90