为什么Try-With-Resources不会每次都创建新实例

时间:2013-12-28 15:29:24

标签: java testng try-with-resources

我正在尝试使用TestNG编写单元测试以将测试数据保存到数据库。我正在使用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异常。为什么PersistenceUtil在try-with-resources块中没有再次初始化。反正有没有实现同样的目标?

2 个答案:

答案 0 :(得分:2)

该错误与自动资源管理无关。每次调用try方法时,getUtil()块都会执行save()

问题在于PersistenceUtil类; getUtil()返回非空PersistenceUtil,但行为不正常,并从null返回getTransaction()

答案 1 :(得分:1)

检查在try-with-resources结束时调用util.close()后,持久层是否保持活动状态。

另请注意,您可以简化对象矩阵的创建:

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]);
         }
      }
   }

}