我正在尝试使用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块中没有再次初始化。反正有没有实现同样的目标?
答案 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]);
}
}
}
}