我目前正在使用play框架开始一个新项目,并使用hibernate和JPA作为存储部分。我已经开发了我的模型,但由于JPA插件处理事务的方式,我觉得非常不方便测试它们。现在运行我的模型测试我正在扩展这个抽象类在stackoverflow上找到答案(是的,我先做了一些研究:))
public abstract class BaseAbstractTest extends TestCase {
EntityManager em;
EntityTransaction transaction;
@Before
public void setUp() {
FakeApplication app = Helpers.fakeApplication();
Helpers.start(app);
Option<JPAPlugin> jpaPlugin = app.getWrappedApplication().plugin(JPAPlugin.class);
em = jpaPlugin.get().em("default");
JPA.bindForCurrentThread(em);
transaction = em.getTransaction();
}
@After
public void tearDown() {
em.close();
JPA.bindForCurrentThread(null);
}
但是为了测试我为模型构建的实用程序方法,我仍然必须手动开始并提交事务,导致这样的方法:
public void testRegisterValidate(){
Client client = new Client("name" , "surname" , "mail@email.com" );
transaction.begin();
boolean registered = (Client.registerUser(client));
transaction.commit();
if (registered)
System.out.println("Id of client is " + client.id);
else
System.out.println("Cannot register this user");
}
这有一些问题,因为一旦我提交了一个事务就会抛出持久性异常,因此,我甚至无法在registerUser方法中捕获它
我的问题是: 是否存在处理此类测试的更好方法?类似于使用@Transactional注释模型实用程序方法并让它们处理事务。 Whare是您使用JPA在游戏框架中处理数据和数据测试的经验/建议吗? 我应该如何处理异常,如persistedExceptions或NoResultException,请记住,我希望尽可能将存储部分分开。 我甚至考虑不使用JPA插件并构建DAO并处理它们“经典方式”在每个DAO中注入SessionFactory对象并使用它来处理数据,有没有人采用这种解决方案?什么是PROS和CONS? 任何建议将不胜感激,谢谢