はじめに
MyBatis-Spring-Boot-Starter-Testを使ってMapperクラスのテストコードを書いてみたので備忘録を残します。
概要
Spring BootでMyBatisを使用しており、MyBatisにより自動生成されたMapperクラスのテストを行う場合は、SpringのDIコンテナを使ってテストを行う必要があります。しかし、単に@SpringBootTest
アノテーション等でSpring Bootの機能を有効にするだけでは、Mapperクラスのテストに不要なAutoConfigureクラスが有効になったり、不要なBeanが生成されたりしてしまいます。
MyBatis-Spring-Boot-Starter-Testを使用することで、このような問題を回避できます。
環境
- Java
- Junit5
- SpringBoot
- MyBatis
- Testcontainers
- Maven
- Windows10
依存関係
MyBatis-Spring-Boot-Starter-Testを使用するためには、以下の依存関係を<dependencies>
に追加してください。
<dependencies>
...
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>2.2.0</version>
<scope>test</scope>
</dependency>
...
</dependencies>
その他、Spring BootやMyBatisを利用するための依存関係も適宜追加してください。
テストコードの記述方法
MyBatis-Spring-Boot-Starter-Testを有効にするための@MybatisTest
アノテーションをテストクラスに付与することで、MyBatis関連のAutoConfigureクラスのみが有効になり、MapperクラスのみがDIコンテナにBean登録されるようになります。
@MybatisTest // MyBatis-Spring-Boot-Starter-Testの有効化
class UserMapperTest {
@Autowired
private UserMapper mapper; // Mapper実装クラスがインジェクション可能になる
@Test
void testUserMapper () {
/* ... */
}
}
また、@MybatisTest
アノテーションのincludeFilters
パラメータやexcludeFilters
パラメータを指定することで、DIコンテナに登録されるBeanを追加したり減らしたりすることも可能です。
@MybatisTest(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,
classes = { UserService.class, AppConfig.class }))
// Mapperクラス以外にも、指定したBeanやJavaConfigもDIコンテナに登録されるよう指定
class UserDaoTest {
@Autowired
private UserDao dao;
@Autowired
private UserService dao; // 指定したBeanもインジェクション可能になる
@Autowired
private PasswordEncoder encoder; // 指定したJavaConfigで定義されているBeanもインジェクション可能になる
/* ... */
}
}
Beanのフィルタリングについては、このページ等を参照してください。
クラスによるフィルタリング以外に、アノテーションの有無によるフィルタリングや正規表現によるフィルタリングも存在します。
参考
- http://mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/index.html
- https://qiita.com/kazuki43zoo/items/ea79e206d7c2e990e478#mybatistestmybatis-spring-boot-starter-test%E3%81%AE%E5%88%A9%E7%94%A8
ご意見・ご指摘等あればコメントいただけると幸いです。