- 3.1. 更新メソッドのテスト
- 3.2. テストデータの作成
- 3.3. 単体テストの実装
3.3 単体テストの実装
単体テストクラスでは、以下の手順でテストを行います。
- setUpメソッド内でテーブルのデータを設定します。accept_orderテーブルのデータを削除し、3.2で準備したaccept_order_data.xmlのデータを投入します。
- testメソッドを実行します。testメソッドでは、storeメソッドを実行した後、テーブルのデータが3.2で準備したaccept_order_data2.xmlのようになっているか、確認します。
- tearDownメソッド内で後片付けを行います。テーブルのデータを、テスト実行前の状態に戻します。
それでは、単体テストを実装しましょう。まず、setUp、tearDownを実装します。setUp、tearDownの各メソッドで行う処理は2章のものと同じになります。
setUpメソッド
protected void setUp() { IDatabaseConnection connection =null; try{ super.setUp(); Connection conn=getConnection(); connection =new DatabaseConnection(conn); //現状のバックアップを取得 QueryDataSet partialDataSet = new QueryDataSet(connection); partialDataSet.addTable("ACCEPT_ORDER"); file=File.createTempFile("accept",".xml"); FlatXmlDataSet.write(partialDataSet, new FileOutputStream(file)); //テストデータを投入する IDataSet dataSet = new FlatXmlDataSet( new FileInputStream("accept_order_test_data.xml")); DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(connection!=null) connection.close(); }catch(SQLException e){} } }
tearDownメソッド
protected void tearDown() throws Exception{ IDatabaseConnection connection =null; try{ super.tearDown(); Connection conn=getConnection(); connection =new DatabaseConnection(conn); IDataSet dataSet = new FlatXmlDataSet(file); DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(connection!=null) connection.close(); }catch(SQLException e){} } }
次に、testメソッドを実装します。testメソッドは以下のようになります。
testStoreメソッド
public void testStore() throws Exception{ //storeメソッドの実行 AcceptOrderBean order=new AcceptOrderBean(); order.setO_num("5004"); order.setC_num("1004"); order.setP_num("501"); order.setDc_rate(20); order.setOption_price(400); order.setEmployee("101"); order.setAccept_date(Date.valueOf("2004-01-03")); order.store(); //実行結果を検証する IDatabaseConnection connection=null; try{ // 期待されるデータを取得 IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream("accept_order_test_data2.xml")); ITable expectedTable = expectedDataSet.getTable("accept_order"); // accept_orderテーブルの状態を確認 Connection conn=getConnection(); connection =new DatabaseConnection(conn); IDataSet databaseDataSet = connection.createDataSet(); ITable actualTable = databaseDataSet.getTable("accept_order"); // 比較する Assertion.assertEquals(expectedTable, actualTable); }finally{ if(connection!=null) connection.close(); } }
まず、テスト対象となる、storeメソッドを実行します。
//storeメソッドの実行 AcceptOrderBean order=new AcceptOrderBean(); order.setO_num("5004"); order.setC_num("1004"); order.setP_num("501"); order.setDc_rate(20); order.setOption_price(400); order.setEmployee("101"); order.setAccept_date(Date.valueOf("2004-01-03")); order.store();
次に、メソッドの実行結果を検証します。DBUnitでは、テーブル・データを比較する場合にはorg.dbunit.dataset.ITableクラスを使用します。org.dbunit.dataset.ITableは、テーブルデータ(の集合)を表すクラスです。まず、テスト結果として期待されるべきテーブルデータを表すITableインスタンスを取得します。
// 期待されるデータを取得 IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream("accept_order_test_data2.xml")); ITable expectedTable = expectedDataSet.getTable("accept_order");
テスト結果として期待されるのは、3.2で作成したaccept_order_test_data2.xmlの値です。そこで、accept_order_test_data2.xmlのデータを表すIDataSetを取得します。次に、IDataSetよりaccept_orderテーブルのデータを表すITableインスタンスを取得します。ITableはIDataSetのgetTableメソッドを使用して取得します。getTableメソッドの引数はテーブルの名前です。
今度は、メソッド実行後のテーブルの状態を取得しましょう。
//実行結果を検証する IDatabaseConnection connection=null; try{ ... // accept_orderテーブルの状態を確認 Connection conn=getConnection(); connection =new DatabaseConnection(conn); IDataSet databaseDataSet = connection.createDataSet(); ITable actualTable = databaseDataSet.getTable("accept_order"); ... }finally{ if(connection!=null) connection.close(); }
ITableを作成するには、IDataSetを取得しなければいけません。DatabaseConnectionのcreateDataSetメソッドを使用して、現在のデータベースのデータを表すIDataSetを取得します。そして、IDataSetのgetTableメソッドを使用して、accpet_orderテーブルのデータを表すITableを取得します。
最後に、期待されるITableと実際のITableの比較を行います。
// 比較する Assertion.assertEquals(expectedTable, actualTable);
ITableの比較はorg.dbunit.AssertionクラスのassertEqualsメソッドを使用します。これで、テストクラスの完成です。
テーブルにデータを挿入するメソッドを例に取り上げましたが、データを削除したり、更新したりするメソッドでも同じようにテストクラスを作成することができます。
実習課題 1
Customerテーブルにデータを挿入するメソッドを持つクラスのテストクラスを、DBUnitを使用して作成しなさい。
- Customer テーブルの構造は以下の通り。
カラム名 データ型 P NN 内容 c_num char(4) * * 顧客番号 c_name varchar(40) 顧客名 address varchar(20) 住所 office char(2) 事業所番号 - Customerテーブルを操作するCustomerBeanクラスを作成する。 CustomerBeanクラスは以下のようになる。
- 以下のフィールドをプライベートフィールドを持つ
フィールド名 データ型 c_num String c_name String address String office String
- storeインスタンスメソッドを持つ。storeメソッドは、customerテーブルにデータを挿入するメソッドである。カラムの値は、同名のインスタンスフィールドの値と同じになる。
- 以下のフィールドをプライベートフィールドを持つ
- CustomerBeanのstoreメソッドをテストするクラスを、DBUnitを使用して作成する。
実習課題 2
実習課題1のCustomerBeanクラスに、テーブルからデータを削除するメソッドを追加し、そのテストクラスをDBUnitを使用して作成しなさい。
- Customer テーブルの構造は実習課題1と同じ
- CustomerBean にdeleteインスタンスメソッドを追加する。deleteメソッドは、c_numカラムがインスタンスフィールドc_numの値と同じデータを削除するメソッド。
- CustomerBeanのdeleteメソッドをテストするクラスを、DBUnitを使用して作成する。