前提・実現したいこと
SpringBootで、Mybatisを利用したマッパーのテストクラスを作成してテストしている
テストして実際に値が取れることを確認したい
※DBはインメモリのH2
発生している問題・エラーメッセージ
テスト実行しても、AutowiredしたマッパーがNULLでテストに失敗する1
※SpringBootを起動して、実行する分には、AutowiredしたMapperにアクセスできる
JUNIT起動時に以下のメッセージがでて失敗する。
java.lang.NullPointerException at com.example.demo.SampleRepositoryTest2.contextLoads(SampleRepositoryTest2.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
該当のソースコード
テストクラス
java
1package com.example.demo; 2 3import java.util.Optional; 4 5import org.junit.Test; 6import org.junit.jupiter.api.Assertions; 7import org.junit.runner.RunWith; 8import org.mybatis.spring.boot.test.autoconfigure.MybatisTest; 9import org.springframework.beans.factory.annotation.Autowired; 10import org.springframework.boot.test.context.SpringBootTest; 11import org.springframework.context.annotation.Import; 12import org.springframework.test.context.junit4.SpringRunner; 13 14import com.example.demo.repository.SampleRepository; 15import com.example.demo.repository.entity.Todo; 16 17@SpringBootTest(classes = SampleRepositoryTest2.class) 18@MybatisTest 19public class SampleRepositoryTest2 { 20 21 @Autowired 22 private SampleRepository repo; 23 24 @Test 25 public void contextLoads() throws Exception { 26 Optional<Todo> todo = repo.findById(1); 27 Assertions.assertEquals(todo.get().getTodoTitle(), "夜ごはんつくる"); 28 29 } 30} 31
リポジトリ
package com.example.demo.repository; import java.util.List; import java.util.Optional; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; import com.example.demo.repository.entity.Todo; @Mapper public interface SampleRepository { @Select("select todo_id, todo_title, finished, created_at from todo where todo_id = #{id}") Optional<Todo> findById(Integer id); @Select("select todo_id, todo_title, finished, created_at from todo ") List<Todo> findAll(); @Select("SELECT COUNT(*) FROM todo WHERE finished = #{finished}") long countByFinished(boolean finished); @Insert("insert into todo ( todo_id, todo_title, finished, created_at ) values (#{todoId},#{todoTitle}, #{finished}, #{created_at})") void insert(Todo todo); }
\src\main\resources\data.sql
INSERT INTO todo ( todo_id, todo_title, finished, created_at ) VALUES ( 1, '朝ごはんつくる', false, '2020-12-01 09:15:00' ); INSERT INTO todo ( todo_id, todo_title, finished, created_at ) VALUES ( 2, '夜ごはんつくる', false, '2020-12-01 09:15:00' );
\src\main\resources\schema.sql
create table if not exists todo ( todo_id int, todo_title varchar(30), finished boolean, created_at timestamp );
build.gradle
plugins { id 'org.springframework.boot' version '2.3.2.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } ext { set('springCloudVersion', "Hoxton.SR7") } dependencies { implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-rest' implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3' implementation 'org.springframework.cloud:spring-cloud-starter-config' implementation 'org.springframework.boot:spring-boot-starter-actuator' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' // implementation 'com.github.springtestdbunit:spring-test-dbunit:1.3.0' // implementation 'org.dbunit:dbunit:2.5.1' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.1.3' testImplementation 'org.springframework.security:spring-security-test' compileOnly("org.projectlombok:lombok") } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } test { useJUnitPlatform() }
試したこと
build.gradleで、mybatisのテストライブラリのバージョンを以下に修正した。
http://mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/
mybatisの公式を確認すると、、SpringBoot2.1以上は、mybatisのテストライブラリのバージョンが2.1が指定されていたため
修正前
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:1.3.4'
修正後
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.1.3'
補足情報(FW/ツールのバージョンなど)
IDE
Spring Tool Suite Version: 3.9.7.RELEASE
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。