[테스트] MyBatis 테스트

MyBatis 테스트

개요

테스트 종류

MyBatis를 테스트하는 방법에는 총 2가지가 존재한다.

  • @MyBatisTest 애너테이션을 사용하는 방법
  • @AutoConfigureMyBatis 애너테이션을 사용하는 방법



MyBatis Test 의존성 추가

MyBatis를 테스트하려면, 먼저 관련 라이브러리를 추가해야한다.


build.gradle 파일

dependencies {
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0' //mybatis
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.2.0' //mybatis test
}



@MyBatisTest 애너테이션

특징

  • @MyBatisTest@WebMvcTest, @SpringBootTest 와 같은 다른 @~Test 애너테이션과 함께 사용할 수 없다.

    이때는 @AutoConfigureMyBatis 를 사용해야한다. 이후에, 자세히 다룬다.

  • 즉, @MyBatisTest 는 오직 Mapper에 대한 유닛 테스트를 수행할 때 사용한다.


예시

  • ArticleMapper 인터페이스

      //import 생략
    
      @Mapper
      public interface ArticleMapper {
    
        @Insert("INSERT INTO article (title, content, writer, datetime) VALUES (#{article.title}, #{article.content}, #{article.writer}, #{article.dateTime})")
        @Options(useGeneratedKeys = true, keyProperty = "id")
        int insertArticle(@Param("article") Article article);
    
        @Select("SELECT * FROM article")
        @Results(id = "ArticleMap", value = {
                @Result(property = "id", column = "id"),
                @Result(property = "title", column = "title"),
                @Result(property = "content", column = "content"),
                @Result(property = "writer", column = "writer"),
                @Result(property = "dateTime", column = "datetime")
        })
        List<Article> getAll();
    
        @Select("SELECT * FROM article WHERE id=#{id}")
        @ResultMap("ArticleMap")
        Article getById(@Param("id") Long id);
    
        @Select("SELECT * FROM article WHERE writer=#{userId}")
        @ResultMap("ArticleMap")
        Article getByWriter(@Param("userId") String userId);
    
        @Update("UPDATE article SET title=#{article.title}, datetime=#{article.dateTime}, content=#{article.content} WHERE id=#{article.id}")
        @ResultMap("ArticleMap")
        int update(@Param("article") Article article);
    
        @Delete("DELETE FROM article WHERE id=#{id}")
        int delete(@Param("id") Long id);
      }
    


  • ArticleMapperTest 테스트 클래스

      //import 생략
    
      @MybatisTest
      class ArticleMapperTest {
    
        @Autowired
        private ArticleMapper articleMapper;
    
        @Transactional
        @DisplayName("Insert & Select 테스트")
        @Test
        void test() {
          Article article = new Article();
          article.setTitle("Test");
          article.setDateTime(LocalDateTime.now());
          article.setWriter(1L);
          article.setContent("Test Content");
          articleMapper.insertArticle(article);
    
          Article selectArticle = articleMapper.getById(article.getId());
    
          assertEquals(article.getId(), selectArticle.getId());
        }
    
      }
    



@AutoConfigureMyBatis 애너테이션

특징

  • @AutoConfigureMyBatis@WebMvcTest, @SpringBootTest 와 같은 다른 @~Test 애너테이션과 함께 사용할 때 사용한다.


예시

  • ArticleMapperTest 테스트 클래스

      //import 생략
    
      @AutoConfigureMybatis // 마이바티스
      @SpringBootTest
      class BoardControllerTest {
          @Autowired
          private ArticleMapper articleMapper;
            
          //기타 테스트 코드
      }