개발 낙서장

[Spring] @DataJpaTest 사용 시 UnsatisfiedDependencyException 발생 본문

Java

[Spring] @DataJpaTest 사용 시 UnsatisfiedDependencyException 발생

권승준 2024. 2. 20. 20:16
@DataJpaTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    User user;

    @Test
    @Order(1)
    @DisplayName("유저 생성")
    void createUser() {
        String username = "abc123";
        String password = "abc123";
        UserRoleEnum role = UserRoleEnum.USER;

        User createdUser = userRepository.save(new User(username, password, role));

        assertNotNull(createdUser.getId());
        assertEquals(username, createdUser.getUsername());
        assertEquals(password, createdUser.getPassword());
        assertEquals(role, createdUser.getRole());

        user = createdUser;
    }
}

@DataJpaTest를 사용해 Repository 테스트를 하려던 중에 에러가 발생했다.

음... 뭐라는 거지...🤨

구글링을 해보니 원인은 @DataJpaTest에게 있었다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(DataJpaTestContextBootstrapper.class)
@ExtendWith({SpringExtension.class})
@OverrideAutoConfiguration(
    enabled = false
)
@TypeExcludeFilters({DataJpaTypeExcludeFilter.class})
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public @interface DataJpaTest {
    String[] properties() default {};

    @PropertyMapping("spring.jpa.show-sql")
    boolean showSql() default true;

    @PropertyMapping("spring.data.jpa.repositories.bootstrap-mode")
    BootstrapMode bootstrapMode() default BootstrapMode.DEFAULT;

    boolean useDefaultFilters() default true;

    ComponentScan.Filter[] includeFilters() default {};

    ComponentScan.Filter[] excludeFilters() default {};

    @AliasFor(
        annotation = ImportAutoConfiguration.class,
        attribute = "exclude"
    )
    Class<?>[] excludeAutoConfiguration() default {};
}

DataJpaTest 어노테이션의 구조이다. 여기에 달려있는 어노테이션을 보면 수상한 어노테이션이 하나 있는데

@AutoConfigureTestDatabase

이름만 봐도 알 수 있듯이 자동으로 테스트용 DB를 구성해준다는 의미라고 한다.
(정확하진 않지만 내장된 메모리 DB로 테스트를 한다는 뜻?)
근데 나는 MySql로 DB를 구성해 테스트를 하려고 했기 때문에 설정이 맞지 않아 에러가 발생했던 것이다.

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

해당 어노테이션을 테스트 클래스 상단에 달아서 해당 설정을 무효화해주면 내가 설정한 DB대로 잘 실행이 된다.

'Java' 카테고리의 다른 글

[Spring] QueryDSL 페이징  (0) 2024.03.12
Name 필드 네이밍에 대한 고찰  (0) 2024.03.05
단위 테스트  (1) 2024.02.16
[Spring] DTO와 Entity  (0) 2024.02.15
데이터베이스(DB, DataBase)  (0) 2024.02.13
Comments