0

TestNG を使用して単体テストを作成し、テスト データを db に保存しようとしています。以下のように、テストデータを作成するために DataProvider を使用しています。

    @DataProvider
private Object[][] movieTitles() {
    return  new Object[][] { 
            new String[] { "Golden Eye" },
            new String[] { "Troy" }, new String[] { "Gladiator" },
            new String[] { "Ring" }, new String[] { "The Village" } };
}

そして、私のテストケースは、以下のように try-with-resources を使用しています:

    @Test(dataProvider = "movieTitles")
public void save(String title) {
         EntityTransaction tx = null;
     try(PersistenceUtil util = PersistenceUtil.getUtil()){ 
         Movie movie = new Movie(title);
     EntityManager em = util.getManager();
         tx = util.getTransaction();    
        tx.begin();
        em.persist(movie);
        tx.commit();
        Assert.assertTrue(movie.getId() > 0);
    } catch (Exception e) {
        if(tx.isActive())
            tx.rollback();
        e.fillInStackTrace();
        return;
    }
}

最初のデータは正常に保存されました。ただし、try ブロックの PersistenceUtil は再度作成/初期化されないため、EntityTransaction は null になります。したがって、残りのデータに対して NPE 例外が発生します。try-with-resources ブロックで PersistenceUtil が再度初期化されないのはなぜですか。とにかく同じことを達成することはありますか?

4

2 に答える 2

2

このバグは、自動リソース管理とは関係ありません。メソッドが呼び出されるたびにブロックtryが実行されます。getUtil()save()

問題はPersistenceUtilクラスにあります。getUtil()は非 nullを返してPersistenceUtilいますが、適切に動作しておらず、から を返しnullますgetTransaction()

于 2013-12-28T19:31:15.047 に答える
1

util.close()try-with-resources の最後に が呼び出された後、永続化レイヤーがライブのままかどうかを確認します。

また、オブジェクト マトリックスの作成を簡素化できることにも注意してください。

public class Main {

   static Object[][] array = {  { "a", "b" } , { "c", "d" } } ;

   // test print
   public static void main(String[] argv) {
      for (int i=0;i<array.length;i++) {
         Object[] sub = array[i];
         for (int j=0;j<sub.length;j++) {
            System.out.println(sub[j]);
         }
      }
   }

}
于 2013-12-28T19:25:10.893 に答える