id, password를 입력해서 login을 수행하는 service의 JUnit 단위 테스트 코드를 작성하였다.
여러 시행착오가 있었는데,, 문제를 해결하면서 찾아간 Mybatis가 쓰이는 테스트코드의 작성법을 정리해봤다.
(JUnit5, Maven 기준)
1. MyBatis-Spring-Boot-Starter-Test 사용하기
MyBatis component를 사용하는 테스트코드를 작성하기 위해 아래 의존성을 pom.xml에 추가해준다.
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>
이제 @MybatisTest 어노테이션을 테스트 클래스에 사용하여 Mybatis Component(Mapper Interface, SqlSession)의 테스트를 진행할 수 있다.
@MybatisTest
public class SessionLoginServiceTest {
@Autowired
UserLoginService loginService;
@DisplayName("로그인 성공")
@Test
void loginSuccessTest() {
Assertions.assertTrue(loginService.login("testId", "12345678"));
}
하지만 다음과 같이 @Autowired를 통해 loginService 빈을 주입하는데에서 오류가 발생하였다.
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ' ' available 라는 에러로 UserLoginService는 Mybatis관련 빈이 아니기 때문에 자동 주입이 불가능한 문제였다.
2. Mapper를 주입한 LoginService 객체 생성
LoginService 빈의 자동주입이 안되기 때문에 Mapper 인터페이스 빈을 주입받은 뒤에, 생성자를 통해 LoginService를 만들어야한다.
@MybatisTest
public class SessionLoginServiceTest {
@Autowired
UserMapper userMapper;
SessionAuthentication authentication = new SessionAuthentication(new MockHttpSession());
UserLoginService loginService;
@BeforeEach
void init() {
loginService = new UserLoginService(authentication, userMapper);
}
@DisplayName("로그인 성공")
@Test
void loginSuccessTest() {
Assertions.assertTrue(loginService.login("testId", "12345678"));
}
LoginService 클래스는 Authentication과 UserMapper 인스턴스를 가지는데 SessionAuthentication클래스의 경우는 MockHttpSession()을사용 하였고, UserMapper의 경우는 Interface로 구현하여, @Autowired로 주입하였다.
테스트의 수행 전에 @BeforeEach 어노테이션이 쓰인 메소드가 실행되어 loginService 객체를 생성한다.
@Mapper
public interface UserMapper {
User selectByUserId(String loginId);
}
UserMapper 인터페이스에는 @Mapper 어노테이션을 사용하여야 스프링 빈으로 관리된다.
또한 인터페이스와 매핑할 mapper.xml의 namespace는 인터페이스의 전체 package를 작성해줘야한다.
application.yml에서는 다음과 같이 mapper.xml을 찾는 경로를 등록해줘야 한다.
mybatis:
mapper-locations: classpath:mapper/*.xml # mapper.xml 의 경로
이제 테스트가 성공 결과를 내었다..!
[참고]
http://mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/
'Programming > Spring Framework' 카테고리의 다른 글
[SpringBoot] 공통 Response 포맷 적용하기 (1) | 2022.01.14 |
---|---|
[SpringBoot] Enum타입을 DB에 변환 저장하는 법 (0) | 2021.12.19 |
[SpringBoot] PetClinic 샘플 프로젝트 - 빌드 및 실행하기 (0) | 2021.11.14 |