かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot で書籍の貸出状況確認・貸出申請する Web アプリケーションを作る ( その56 )( TableDataAssert クラスの機能追加 )

概要

Spring Boot で書籍の貸出状況確認・貸出申請する Web アプリケーションを作る ( その55 )( TestDataResource クラスの機能追加2 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • TableDataAssert クラスの機能追加・変更
      • 第1引数 String tableName だけの assertEquals メソッドを追加する
      • assertEqualsByQuery メソッドを追加する
      • assertEqualsByExcludingColumn, assertEqualsByIncludingColumn メソッドを削除する
      • TableDataAssert クラス内の NULL_STRING は削除し DbUnitUtils.NULL_STRING を使用する

参照したサイト・書籍

目次

  1. 第1引数 String tableName だけの assertEquals メソッドを追加する
  2. assertEqualsByQuery メソッドを追加する
  3. assertEqualsByExcludingColumn, assertEqualsByIncludingColumn メソッドを削除する
  4. TableDataAssert クラス内の NULL_STRING は削除し DbUnitUtils.NULL_STRING を使用する

手順

第1引数 String tableName だけの assertEquals メソッドを追加する

  1. feature/86-issue ブランチを作成します。

  2. src/test/java/ksbysample/common/test/rule/db の下の TableDataAssert.javaリンク先のその1の内容 に変更します。

動作確認します。src/test/java/ksbysample/webapp/lending の下の TestDataResourceTest.java のテストメソッド内の tableDataAssert.assertEquals メソッドを第1引数だけにします。

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @BaseTestData("testdata/base")
    @BaseTestSql(order = 1, sql = "insert into library_forsearch values ('Kanagawa_Sample', null)")
    @BaseTestSql(order = 2, sql = "update library_forsearch set formal = '図書館サンプル' where systemid = 'Kanagawa_Sample'")
    public static class テストクラス {

        @Rule
        @Autowired
        @BaseTestSql(sql = "update user_role set role = 'ROLE_APPROVER' where role_id in (6, 9)")
        public TestDataResource testDataResource;

        @Autowired
        private DataSource dataSource;

        @Test
        @BaseTestSql(sql = "delete from user_info where user_id in (4, 5, 6, 7, 8)")
        @BaseTestSql(sql = "update user_info set username = 'tanaka jiro' where user_id = 1")
        @TestData("web/confirmresult/testdata/001")
        @TestSql(sql = "update lending_app set status = '3' where lending_app_id = 105")
        public void テストメソッド() throws Exception {
            IDataSet dataSet = new CsvDataSet(new File("src/test/resources/testdata/assertdata"));
            TableDataAssert tableDataAssert = new TableDataAssert(dataSet, dataSource);
            tableDataAssert.assertEquals("lending_app");
            tableDataAssert.assertEquals("lending_book");
            tableDataAssert.assertEquals("library_forsearch");
            tableDataAssert.assertEquals("user_info");
            tableDataAssert.assertEquals("user_role");
        }

    }

テストメソッドの左側の矢印アイコンをクリックしてコンテキストメニューを表示し、「Run 'テストメソッド()'」を選択してテストを実行します。

テストが成功することが確認できます。

f:id:ksby:20160220164816p:plain

commit、GitHub へ Push、feature/86-issue -> 1.0.x へ Pull Request、1.0.x でマージ、feature/86-issue ブランチを削除、をします。

assertEqualsByQuery メソッドを追加する

  1. feature/93-issue ブランチを作成します。

  2. src/test/java/ksbysample/common/test/rule/db の下の TableDataAssert.javaリンク先のその2の内容 に変更します。

動作確認します。src/test/java/ksbysample/webapp/lending の下の TestDataResourceTest.java のテストメソッド内の tableDataAssert.assertEquals メソッドを使用しているものを一部だけ assertEqualsByQuery メソッドに変更します。

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @BaseTestData("testdata/base")
    @BaseTestSql(order = 1, sql = "insert into library_forsearch values ('Kanagawa_Sample', null)")
    @BaseTestSql(order = 2, sql = "update library_forsearch set formal = '図書館サンプル' where systemid = 'Kanagawa_Sample'")
    public static class テストクラス {

        @Rule
        @Autowired
        @BaseTestSql(sql = "update user_role set role = 'ROLE_APPROVER' where role_id in (6, 9)")
        public TestDataResource testDataResource;

        @Autowired
        private DataSource dataSource;

        @Test
        @BaseTestSql(sql = "delete from user_info where user_id in (4, 5, 6, 7, 8)")
        @BaseTestSql(sql = "update user_info set username = 'tanaka jiro' where user_id = 1")
        @TestData("web/confirmresult/testdata/001")
        @TestSql(sql = "update lending_app set status = '3' where lending_app_id = 105")
        public void テストメソッド() throws Exception {
            IDataSet dataSet = new CsvDataSet(new File("src/test/resources/testdata/assertdata"));
            TableDataAssert tableDataAssert = new TableDataAssert(dataSet, dataSource);
            tableDataAssert.assertEqualsByQuery("select status from lending_app where lending_app_id = 105"
                    , "lending_app", new String[]{"status"}, AssertOptions.INCLUDE_COLUMN);
            tableDataAssert.assertEqualsByQuery("select * from lending_book order by lending_book_id", "lending_book");
            tableDataAssert.assertEquals("library_forsearch");
            tableDataAssert.assertEquals("user_info");
            tableDataAssert.assertEquals("user_role");
        }

    }

テストメソッドの左側の矢印アイコンをクリックしてコンテキストメニューを表示し、「Run 'テストメソッド()'」を選択してテストを実行します。

テストが成功することが確認できます。

f:id:ksby:20160220181805p:plain

commit、GitHub へ Push、feature/93-issue -> 1.0.x へ Pull Request、1.0.x でマージ、feature/93-issue ブランチを削除、をします。

assertEqualsByExcludingColumn, assertEqualsByIncludingColumn メソッドを削除する

現在使っていないのと、今後も使わなそうなので削除します。

  1. feature/99-issue ブランチを作成します。

  2. src/test/java/ksbysample/common/test/rule/db の下の TableDataAssert.java から assertEqualsByExcludingColumn, assertEqualsByIncludingColumn メソッドを削除します。

  3. commit、GitHub へ Push、feature/99-issue -> 1.0.x へ Pull Request、1.0.x でマージ、feature/99-issue ブランチを削除、をします。

TableDataAssert クラス内の NULL_STRING は削除し DbUnitUtils.NULL_STRING を使用する

  1. feature/102-issue ブランチを作成します。

  2. src/test/java/ksbysample/common/test/rule/db の下の TableDataAssert.javaリンク先のその3の内容 に変更します。

  3. 「Run 'テストメソッド()'」を選択してテストを実行して、テストが成功することを確認します。

  4. commit、GitHub へ Push、feature/102-issue -> 1.0.x へ Pull Request、1.0.x でマージ、feature/102-issue ブランチを削除、をします。

ソースコード

TableDataAssert.java

■その1

public class TableDataAssert {

    private static final String NULL_STRING = "[null]";

    private final IDataSet dataSet;

    private final DataSource dataSource;

    public TableDataAssert(IDataSet dataSet, DataSource dataSource) {
        ReplacementDataSet replacementDataset = new ReplacementDataSet(dataSet);
        replacementDataset.addReplacementObject(NULL_STRING, null);
        this.dataSet = replacementDataset;
        this.dataSource = dataSource;
    }

    public void assertEquals(String tableName)
            throws DatabaseUnitException, SQLException {
        assertEquals(tableName, new String[]{}, AssertOptions.EXCLUDE_COLUM);
    }

    ..........
  • public void assertEquals(String tableName) メソッドを追加します。

■その2

    public void assertEquals(String tableName, String[] columnNames, AssertOptions options)
            throws DatabaseUnitException, SQLException {
        ITable expected = expectedTable(tableName, columnNames, options);
        ITable actual = actualTable(tableName, columnNames, options);
        Assertion.assertEquals(expected, actual);
    }

    public void assertEqualsByQuery(String sqlQuery, String tableName)
            throws SQLException {
        assertEqualsByQuery(sqlQuery, tableName, null, AssertOptions.EXCLUDE_COLUM);
    }

    public void assertEqualsByQuery(String sqlQuery, String tableName, String[] columnNames, AssertOptions options)
            throws SQLException {
        IDatabaseConnection conn = null;
        try (Connection connection = dataSource.getConnection()) {
            conn = DbUnitUtils.createDatabaseConnection(connection);
            ITable expected = expectedTable(tableName, columnNames, options);
            Assertion.assertEqualsByQuery(expected, conn, tableName, sqlQuery, new String[]{});
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (conn != null) conn.close();
            } catch (Exception ignored) {
            }
        }
    }
  • 以下の2つのメソッドを追加します。
    • public void assertEqualsByQuery(String tableName, String sqlQuery)
    • public void assertEqualsByQuery(String tableName, String sqlQuery, String[] ignoreColumnNames)

■その3

public class TableDataAssert {

    private final IDataSet dataSet;

    private final DataSource dataSource;

    public TableDataAssert(IDataSet dataSet, DataSource dataSource) {
        ReplacementDataSet replacementDataset = new ReplacementDataSet(dataSet);
        replacementDataset.addReplacementObject(DbUnitUtils.NULL_STRING, null);
        this.dataSet = replacementDataset;
        this.dataSource = dataSource;
    }
  • private static final String NULL_STRING = "[null]"; を削除します。
  • コンストラクタ内の NULL_STRINGDbUnitUtils.NULL_STRING へ変更します。

■今回の修正後の全体ソース

package ksbysample.common.test.rule.db;

import org.dbunit.Assertion;
import org.dbunit.DatabaseUnitException;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.DataSetException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.ReplacementDataSet;
import org.dbunit.dataset.filter.DefaultColumnFilter;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class TableDataAssert {

    private final IDataSet dataSet;

    private final DataSource dataSource;

    public TableDataAssert(IDataSet dataSet, DataSource dataSource) {
        ReplacementDataSet replacementDataset = new ReplacementDataSet(dataSet);
        replacementDataset.addReplacementObject(DbUnitUtils.NULL_STRING, null);
        this.dataSet = replacementDataset;
        this.dataSource = dataSource;
    }

    public void assertEquals(String tableName)
            throws DatabaseUnitException, SQLException {
        assertEquals(tableName, new String[]{}, AssertOptions.EXCLUDE_COLUM);
    }

    public void assertEquals(String tableName, String[] columnNames)
            throws DatabaseUnitException, SQLException {
        assertEquals(tableName, columnNames, AssertOptions.EXCLUDE_COLUM);
    }

    public void assertEquals(String tableName, String[] columnNames, AssertOptions options)
            throws DatabaseUnitException, SQLException {
        ITable expected = expectedTable(tableName, columnNames, options);
        ITable actual = actualTable(tableName, columnNames, options);
        Assertion.assertEquals(expected, actual);
    }

    public void assertEqualsByQuery(String sqlQuery, String tableName)
            throws SQLException {
        assertEqualsByQuery(sqlQuery, tableName, null, AssertOptions.EXCLUDE_COLUM);
    }

    public void assertEqualsByQuery(String sqlQuery, String tableName, String[] columnNames, AssertOptions options)
            throws SQLException {
        IDatabaseConnection conn = null;
        try (Connection connection = dataSource.getConnection()) {
            conn = DbUnitUtils.createDatabaseConnection(connection);
            ITable expected = expectedTable(tableName, columnNames, options);
            Assertion.assertEqualsByQuery(expected, conn, tableName, sqlQuery, new String[]{});
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (conn != null) conn.close();
            } catch (Exception ignored) {
            }
        }
    }

    private ITable expectedTable(String tableName, String[] columnNames, AssertOptions options) throws DataSetException {
        ITable table = dataSet.getTable(tableName);
        if (columnNames != null) {
            table = columnFilter(table, columnNames, options);
        }
        return table;
    }

    private ITable actualTable(String tableName, String[] columnNames, AssertOptions options)
            throws DatabaseUnitException, SQLException {
        IDatabaseConnection conn = null;
        ITable table = null;
        try (Connection connection = this.dataSource.getConnection()) {
            conn = DbUnitUtils.createDatabaseConnection(connection);
            table = conn.createDataSet().getTable(tableName);
            if (columnNames != null) {
                table = columnFilter(table, columnNames, options);
            }
        } finally {
            try {
                if (conn != null) conn.close();
            } catch (Exception ignored) {
            }
        }
        return table;
    }

    private ITable columnFilter(ITable table, String[] columnNames, AssertOptions options)
            throws DataSetException {
        if (options == AssertOptions.EXCLUDE_COLUM) {
            table = DefaultColumnFilter.excludedColumnsTable(table, columnNames);
        } else {
            table = DefaultColumnFilter.includedColumnsTable(table, columnNames);
        }
        return table;
    }

}

履歴

2016/02/20
初版発行。