문제 발생
새로운 API를 제작하면서 테스트코드를 진행하던 도중, 모든 테스트 코드가 먹통이 되기 시작했다.
Application Run을 했을 경우에는 에러가 발생하지 않았다.
에러코드
Description:
Parameter 1 of constructor in com.likelion.finalproject.controller.restcontroller.PostRestController required a bean of type 'com.likelion.finalproject.service.LikeService' that could not be found.
Action:
Consider defining a bean of type 'com.likelion.finalproject.service.LikeService' in your configuration.
PostRestController 생성자의 첫 번째(0번째 아님)의 빈 관련 오류인 것 같아 보였다.
해당 컨트롤러의 필드는 다음과 같다.
@RequestMapping("/api/v1/posts")
@RestController
@RequiredArgsConstructor
@Slf4j
public class PostRestController {
private final PostService postService;
private final LikeService likeService;
private final CommentService commentService;
}
구글에 관련 에러에 대해 질문 하게 되면 빈 주입에 관한 글들이 굉장히 많다.
에러가 발생하고 있는 LikeService 내부는 다음과 같다.
@Service
@RequiredArgsConstructor
public class LikeService {
private final LikeRepository likeRepository;
private final AlarmRepository alarmRepository;
private final ValidateService service;
}
@Service 어노테이션을 붙여놨기 때문에 기본적인 Bean 주입은 이상이 없다.
문제 해결
급한 불을 꺼야했기 때문에, 일단 PostRestController 한 곳에 박아놨던 likeService, CommentService를 각각 Controller를 생성하여 분리시켰다.
두 서비스를 하나의 컨트롤러에서 처리하도록 한 이유는 요구사항의 url("api/v1/posts/..."로 시작하는)이 같았기 때문이다.
공통된 url을 공유하고 있음에도 불구하고 따로 controller를 만드는 것이 효율적이지 않다고 판단했었다.
에러가 발생하고 일단 분리를 시켜봤는데, 에러가 스윽 사라졌다.
그렇다면 원인은 무엇이었을까?
왜, RUN은 되는데 TEST CODE는 에러가 발생했던 것일까?
왜, 생성자에 대한 에러가 계속해서 발생하는 것일까?
원인
문제는 TEST CODE에서 발생했다.
POST CONTROLLER 테스트 코드는 다음과 같이 시작한다.
@WebMvcTest(PostRestController.class)
@WithMockUser
class PostControllerTest {
@Autowired
MockMvc mockMvc;
@Autowired
ObjectMapper objectMapper;
@MockBean
UserService userService;
@MockBean
PostService postService;
@MockBean
CommentService commentService;
private String token;
@Value("${jwt.secret}")
private String secretKey;
}
PostController에서 LikeService를 생성자로 주입했지만, 테스트 쪽에서는 주입을 하지 않았기 때문에 생기는 에러였다.
...
class PostControllerTest {
...
@MockBean
LikeService likeSerivce;
...
}
위와 같이 LikeService를 @MockBean을 사용해서 선언했을 때, 모든 에러는 신기루같이 사라졌다.
결론
Controller에 생성된 모든 조건을 ControllerTest에도 동일하게 환경을 맞춰주어야 한다는 것을 알았다.
아직 Test Code에서 사용하지도 않은 LikeService가 문제를 일으킬 줄은 상상도 하지 못했다.
설마 하는 마음에 테스트 코드에 추가하였고, 이걸로 문제가 해결되었다니..
구글에서도 보이지 않던 귀한 에러였다..