期待値のファイルとデータベースのテーブルをアノテーションでアサートする

期待値のファイルとデータベースのテーブルをアサートするアノテーションを作りました。 @TableAssertです。

こんな感じ。

  1. @TableAssert(names = "dept", pathname = "insert_expected.xml")
  2. @SetUpOperation(pathname = "dept.xml", value = DatabaseOperationType.DELETE_ALL)
  3. public void testTableAssert() {
  4. insert();
  5. }
必須属性はnamesとpathnameです。 この2つだけなら、namesにデータベースのテーブル名を記述します。

つまり、今回はdeptテーブルと期待値ファイルをアサートします。

アサートは、期待値のファイルにあるカラムだけ比較します。

pathnameには期待値のファイルを記述します。この場合、「insert_expected.xml」が期待値のファイルです。

ファイル名だけであれば、テストクラスと同パッケージに配置します。 内容はDbUnitの形式です。

SQL文を直接記述することもできます。

  1. @TableAssert(names = "dept", pathname = "org/dbunitng/sample/dao/insert_expected.xml", queries = "select dname, deptno, loc from dept")
  2. @SetUpOperation(pathname = "dept.xml", value = DatabaseOperationType.DELETE_ALL)
  3. public void testTableAssert2() {
  4. insert();
  5. }
queries属性にはSQL文を記述します。その結果がDbUnitのITableとなります。 ITableのテーブル名はnames属性に記述した名前になります。

つまり、この例ではSQL文の結果がITableとなり、テーブル名はdeptとなります。

XMLで表現すると以下のイメージです。

  1. <dataset>
  2. <DEPT DEPTNO="1" DNAME="test" LOC="Osaka" />
  3. </dataset>

結果をDBから取得するクエリをプロパティファイルに記述できるようにしました。

  1. @TableAssert(names = "dept", pathname = "insert_expected.xml", propertyFilePath="query.properties", keys="test")
  2. @SetUpOperation(pathname = "dept.xml", value = DatabaseOperationType.DELETE_ALL)
  3. public void testTableAssert3() {
  4. insert();
  5. }
クエリを直接Javaコードに記述すると読みづらいので。

@TableAssertのpropertyFilePath属性がプロパティファイルへのパスです。

「/」がない場合、テストクラスと同じパッケージにあるファイルを探します。

「/」があればクラスパスのルートからの位置になります。

keysに指定したキーの値としてクエリを書きます。

  1. test = select dname, deptno, loc from dept
namesはクエリの結果を格納するDbUnitのITableのテーブル名です。