前提
SpringBootで従業員管理システムを開発しています。
ホーム画面の処理をDBUnitでテストしようとしたところ、NullPointerExceptionが返されます。
ホーム画面では従業員が全件表示されるようにデータベースから取得し表示しています。
ローカル環境ではMySQLを使用していますが、単体テスト用にH2データベースを使っております。
実現したいこと
- select文でデータ1件を取得しListに格納、List.sizeで1件であればテスト成功にしたい
発生している問題・エラーメッセージ
java.lang.NullPointerException at com.example.demo.HomeControllerTest.全件表示のテスト(HomeControllerTest.java:79)
該当のソースコード
Java
1package com.example.demo; 2 3import static org.junit.jupiter.api.Assertions.*; 4 5import java.io.File; 6import java.nio.charset.StandardCharsets; 7import java.util.List; 8import java.util.Map; 9 10import javax.transaction.Transactional; 11 12import org.dbunit.IDatabaseTester; 13import org.dbunit.JdbcDatabaseTester; 14import org.dbunit.dataset.IDataSet; 15import org.dbunit.dataset.xml.FlatXmlDataSetBuilder; 16import org.dbunit.operation.DatabaseOperation; 17import org.h2.tools.RunScript; 18import org.junit.jupiter.api.BeforeAll; 19import org.junit.jupiter.api.Test; 20import org.springframework.beans.factory.annotation.Autowired; 21import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; 22import org.springframework.jdbc.core.JdbcTemplate; 23import org.springframework.test.context.TestExecutionListeners; 24import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; 25 26import com.github.springtestdbunit.TransactionDbUnitTestExecutionListener; 27import com.github.springtestdbunit.annotation.DatabaseSetup; 28 29@AutoConfigureMockMvc 30@TestExecutionListeners({ 31 DependencyInjectionTestExecutionListener.class, // このテストクラスでDIを使えるように指定 32 TransactionDbUnitTestExecutionListener.class // @DatabaseSetupや@ExpectedDatabaseなどを使えるように指定 33}) 34@Transactional 35public class HomeControllerTest { 36 private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); 37 private static final String JDBC_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; 38 private static final String USER = "sa"; 39 private static final String PASSWORD = ""; 40 41 @Autowired 42 private JdbcTemplate jdbcTemplate; 43 44 @BeforeAll 45 public static void createSchema() throws Exception { 46 RunScript.execute(JDBC_URL, USER, PASSWORD, "src/test/resources/schema.sql", StandardCharsets.UTF_8, false); 47 } 48 49 private IDataSet readDataSet(String dataPath) throws Exception { 50 // for XML 51 return new FlatXmlDataSetBuilder().build(new File(dataPath)); 52 } 53 54 private void cleanlyInsert(IDataSet dataSet) throws Exception { 55 IDatabaseTester databaseTester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); 56 databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT); 57 databaseTester.setDataSet(dataSet); 58 databaseTester.onSetup(); 59 } 60 61 @Test 62 void 全件表示のテスト() throws Exception { 63 // Arrange 64 IDataSet dataSet = readDataSet("src/test/resources/testdata/init-data/initData.xml"); 65 cleanlyInsert(dataSet); 66 67 String sql = "select * from m_employee"; 68 List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); 69 70 assertEquals(1, list.size()); 71 } 72}
schema.sql
1create table IF NOT EXISTS m_employee 2( 3 id int auto_increment, 4 name varchar(50) not null, 5 name_kana varchar(50) not null, 6 status varchar(50) not null, 7 telephone_number varchar(50), 8 mail_address varchar(50), 9 entering_date date not null, 10 primary key (id) 11);
initData.xml
1<?xml version="1.0" encoding="UTF-8"?> 2<dataset> 3 <m_employee 4 id="1" 5 name="サンプル 一郎" 6 name_kana="サンプル イチロウ" 7 status="在職" 8 telephone_number="090-0000-0001" 9 mail_address="sample01@example.com" 10 entering_date="2022-04-01" 11 /> 12</dataset>
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー