0

我正在尝试使用 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 为空。因此,其余数据会发生 NPE 异常。为什么 PersistenceUtil 没有在 try-with-resources 块中再次初始化。反正有没有达到同样的效果?

4

2 回答 2

2

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

问题出在PersistenceUtil课堂上;getUtil()正在返回一个非 null PersistenceUtil,但它的行为不正确,并nullgetTransaction().

于 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 回答