Service 테스트를 만들어 돌려보는데, 계속 NullPointerException이 나와 테스트를 진행을 할 수 없었다.
java.lang.NullPointerException
at 파일 위치.backend.service.AnswerServiceTest.createAnswer(AnswerServiceTest.java:69)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
시도 1 : 해당 서비스 위에 @Autowired
→ fail
@ExtendedWith(MockitoExtension.class)
class AnswerServiceTest {
@Autowired
AnswerService answerservice;
...
2. 해당 서비스 위에 @InjectMocks
→ fail
@ExtendedWith(MockitoExtension.class)
class AnswerServiceTest {
@InjectMocks
AnswerService answerservice;
...
3. 해당 Service를 새로 MockService로 파일을 하나 만들어 구현 → fail
MockAnswerService
@ExtendedWith(MockitoExtension.class)
class AnswerServiceTest {
@Autowired
MockAnswerService answerservice;
...
MockAnswerService
public class MockAnswerService {
private final MockAnswerRepository answerRepository;
private final MockInterviewRepository interviewRepository;
public MockAnswerService() {
interviewRepository = new MockInterviewRepository();
answerRepository = new MockAnswerRepository();
}
public ResponseDto<?> createAnswer(Long interviewId, AnswerRequestDto requestDto, Member member) {
@SpringBootTest가 주로 하는 역할 중 하나가 @SpringBootApplication을 찾아서 테스트를 위한 Bean을 생성해주는 것이라고 한다. 이 과정이 빠졌기 때문에 제대로 Bean이 생성되지 않아 해당 Service가 리턴하는 값이 계속 Null값이 나왔던 듯 하다.
💡 참고 : SpringBootTest의 역할
- @SpringBootApplication을 찾아서 테스트를 위한 Bean을 생성한다.
- @MockBean으로 정의된 Bean을 찾아서 대체시킨다.
- @RunWith(SpringRunner.class)와 같이 정의하여야 동작한다. (Junit5에서 생략가능)
테스트 코드 위에 @ExtendedWith(MockitoExtension.class)
를 @SpringBootTest
로 변경하여 해결했다.
@SpringBootTest
class AnswerServiceTest {
@Autowired
AnswerService answerService;
...