SpringBootでDBUnitでテストを実行したが、H2データベースに値が入らず、ヌルポが返される

前提

SpringBootで従業員管理システムを開発しています。
ホーム画面の処理をDBUnitでテストしようとしたところ、NullPointerExceptionが返されます。
ホーム画面では従業員が全件表示されるようにデータベースから取得し表示しています。

ローカル環境ではMySQLを使用していますが、単体テスト用にH2データベースを使っております。

実現したいこと

発生している問題・エラーメッセージ

java.lang.NullPointerException at com.example.demo.HomeControllerTest.全件表示のテスト(HomeControllerTest.java:79)

該当のソースコード

Java

package com.example.demo; import static org.junit.jupiter.api.Assertions.*; import java.io.File;import java.nio.charset.StandardCharsets;import java.util.List;import java.util.Map; import javax.transaction.Transactional; import org.dbunit.IDatabaseTester;import org.dbunit.JdbcDatabaseTester;import org.dbunit.dataset.IDataSet;import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;import org.dbunit.operation.DatabaseOperation;import org.h2.tools.RunScript;import org.junit.jupiter.api.BeforeAll;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.test.context.TestExecutionListeners;import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import com.github.springtestdbunit.TransactionDbUnitTestExecutionListener;import com.github.springtestdbunit.annotation.DatabaseSetup; @AutoConfigureMockMvc@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, // このテストクラスでDIを使えるように指定 TransactionDbUnitTestExecutionListener.class // @DatabaseSetupや@ExpectedDatabaseなどを使えるように指定})@Transactionalpublic class HomeControllerTest { private static final String JDBC_DRIVER = org.h2.Driver.class.getName(); private static final String JDBC_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1"; private static final String USER = "sa"; private static final String PASSWORD = ""; @Autowired private JdbcTemplate jdbcTemplate; @BeforeAll public static void createSchema() throws Exception { RunScript.execute(JDBC_URL, USER, PASSWORD, "src/test/resources/schema.sql", StandardCharsets.UTF_8, false); } private IDataSet readDataSet(String dataPath) throws Exception { // for XML return new FlatXmlDataSetBuilder().build(new File(dataPath)); } private void cleanlyInsert(IDataSet dataSet) throws Exception { IDatabaseTester databaseTester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD); databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT); databaseTester.setDataSet(dataSet); databaseTester.onSetup(); } @Test void 全件表示のテスト() throws Exception { // Arrange IDataSet dataSet = readDataSet("src/test/resources/testdata/init-data/initData.xml"); cleanlyInsert(dataSet); String sql = "select * from m_employee"; List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); assertEquals(1, list.size()); }}

schema.sql

create table IF NOT EXISTS m_employee ( id int auto_increment, name varchar(50) not null, name_kana varchar(50) not null, status varchar(50) not null, telephone_number varchar(50), mail_address varchar(50), entering_date date not null, primary key (id) );

initData.xml

<?xml version="1.0" encoding="UTF-8"?> <dataset> <m_employee id="1" name="サンプル 一郎" name_kana="サンプル イチロウ" status="在職" telephone_number="090-0000-0001" mail_address="sample01@example.com" entering_date="2022-04-01" /> </dataset>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

コメントを投稿

0 コメント