我正在尝试使用 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/