문제 상황
PostService에서 사용하는 PostRepository(Jpa)에 직접 의존을 하고 있었고 이런 구조는 상위모듈이 하위모듈에 직접 의존하는 관계라고 생각해서 DIP을 사용해 자주 변하는것과 변하지 않는것을 구분하는 설계로 변경했다. 하지만 그 뒤에 정상적으로 동작하던 테스트가 깨져버렸다..
적용된 Repository
// PostRepository는 도메인 Repository
@Repository
@RequiredArgsConstructor
public class PostRepositoryAdapter implements PostRepository {
private final PostJpaRepository postJpaRepository;
@Override
public Post save(Post post) {
...
}
@Override
public List<Post> saveAll(Iterable<Post> posts) {
...
}
@Override
public Slice<Post> findAll(Pageable pageable) {
...
}
@Override
public Post getById(Long postId) {
...
}
@Override
public void delete(Post post) {
...
}
}
문제점
JpaRepository를 직접 사용하고 있을때는 실패하지 않았던 Repository 테스트가 분리만 했을뿐인데 실패하는 테스트가 되어버리고 말았다.
이유는 PostRepository Bean을 최소 1개 이상을 기대했지만 찾을 수 없다는 예외가 발생했다. 즉 새로 분리한 PostRepositoryAdapter가 등록되지 않았다는 것이다.
당연히 @DataJpaTest를 사용했으니 @Repository가 Bean으로 등록되어 주입되기를 기대했지만 주입되지 않는 문제가 발생했다.
해결 방법
문제는 특정 Bean이 등록되지 못하는 문제이기 때문에 Bean을 등록해 주면 된다. @Configuration을 통해 Bean을 주입할 수 있듯이
테스트 환경에서 사용되는 @TestConfiguration을 통해 Bean을 등록한다.
PostRepositoryAdaptor는 필드에 PostJpaRepository를 필요로 하고 @DataJpaTest가 PostJpaRepository는 Bean으로 등록해 주므로 파라미터 받아서 PostRepositoryAdapter를 Bean으로 등록해 주면 된다.
@DataJpaTest
@Import(value = {JpaConfig.class})
public class RepositoryTest {
@TestConfiguration
public static class QueryDslTestConfig {
@Bean
public PostRepository postRepository(PostJpaRepository postJpaRepository) {
return new PostRepositoryAdapter(postJpaRepository);
}
}
}
'BE > Spring' 카테고리의 다른 글
[Spring] InvalidDataAccessApiUsageException 예외 전환으로 테스트 실패 (0) | 2023.10.31 |
---|---|
[JPA] LazyLoading could not initialize proxy - no Session 문제 해결하기 (1) | 2023.10.30 |
스프링부트에서 레디스 컨테이너 Connection refused 문제 해결 (0) | 2023.08.28 |
@SpringBootApplication 이란? (0) | 2023.08.10 |
스프링부트3 Spring REST docs + Swagger UI 사용하기 (0) | 2023.08.04 |