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

标签 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 block 中的 PersistenceUtil 不会再次创建/初始化,因此 EntityTransaction 为 null。因此其余数据会发生 NPE 异常。为什么 PersistenceUtil 没有在 try-with-resources block 中再次初始化。有没有办法达到同样的效果?

最佳答案

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

问题出在 PersistenceUtil类(class); getUtil()返回非空 PersistenceUtil ,但它的行为不正常,并返回 null来自getTransaction()

关于java - 为什么 Try-With-Resources 不会每次都创建一个新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816192/

相关文章:

java - 什么时候使用静态方法和字段?

java - TestNG 对所有测试套件运行一次方法

java - 为什么在使用 try-with-resources 时在 try() 中声明 Resource

java - 我应该如何将 try-with-resources 与 JDBC 结合使用?

java - 关闭 Hook 与终结器方法

java - 静态数组长度,替换值

java - JCS还是java.util.Map,哪个在时间上效率更高?

java - 使用 dataprovider 的 TestNG 并行测试/方法

java - try-with-resources 中的两种关闭方法

java - 使用 Java Soap 客户端进行抢先授权