Hibernate 如何在tapestry相关项目中测试DAO层
我有一个tapestry5+hibernate应用程序,我正试图为它编写单元测试。我正在寻找一些指导或最佳实践,以便在此类项目中测试DAO层。 我使用testng尝试了下面的测试用例,但没有成功Hibernate 如何在tapestry相关项目中测试DAO层,hibernate,unit-testing,tapestry,Hibernate,Unit Testing,Tapestry,我有一个tapestry5+hibernate应用程序,我正试图为它编写单元测试。我正在寻找一些指导或最佳实践,以便在此类项目中测试DAO层。 我使用testng尝试了下面的测试用例,但没有成功 @Test public void createOrderTest() { IOCUtilities.buildDefaultRegistry(); OrderManager orderManager = new OrderManager(); Order o1 = new Or
@Test
public void createOrderTest() {
IOCUtilities.buildDefaultRegistry();
OrderManager orderManager = new OrderManager();
Order o1 = new Order();
Date date = new Date(System.currentTimeMillis());
o1.setOrderDate(date);
o1.setOrderStatus(OrderStatus.BILLED.toString());
orderManager.createOrder(o1);
}
尝试运行测试用例时获取错误消息
java.lang.IllegalArgumentException: Contribution org.apache.tapestry5.yuicompressor.services.YuiCompressorModule.contributeMinimizers(MappedConfiguration) (at YuiCompressorModule.java:42) is for service 'interface org.apache.tapestry5.services.assets.ResourceMinimizer' qualified with marker annotations [interface org.apache.tapestry5.ioc.annotations.Primary], which does not exist.
at org.apache.tapestry5.ioc.internal.RegistryImpl.validateContributeDefs(RegistryImpl.java:246)
at org.apache.tapestry5.ioc.internal.RegistryImpl.<init>(RegistryImpl.java:205)
at org.apache.tapestry5.ioc.RegistryBuilder.build(RegistryBuilder.java:177)
at org.apache.tapestry5.ioc.IOCUtilities.buildDefaultRegistry(IOCUtilities.java:51)
at com.vc.xpressor.testng.OrderManagerTest.createOrderTest(OrderManagerTest.java:21)
java.lang.IllegalArgumentException:Contribution org.apache.tapestry5.yuicompressor.services.YuiCompressorModule.contributerMinimizers(MappedConfiguration)(位于YuiCompressorModule.java:42)用于带有标记注释的服务“interface org.apache.tapestry5.services.assets.ResourceMinimizer”[interface org.apache.tapestry5.ioc.annotations.Primary],它不存在。
位于org.apache.tapestry5.ioc.internal.RegistryImpl.ValidateCommitteedEFS(RegistryImpl.java:246)
位于org.apache.tapestry5.ioc.internal.registrympl.(registrympl.java:205)
位于org.apache.tapestry5.ioc.RegistryBuilder.build(RegistryBuilder.java:177)
位于org.apache.tapestry5.ioc.IOCUtilities.buildDefaultRegistry(IOCUtilities.java:51)
在com.vc.xpressor.testng.OrderManagerTest.createOrderTest(OrderManagerTest.java:21)上
如果在DAO中使用构造函数注入,则在DAO测试中根本不需要tapestry。DAO所需的唯一依赖项是hibernate会话,可能还有几个@符号,这一点我说得对吗
如果是这样的话,您所需要的就是建立到内存中数据库(如h2)的连接,并将其包装到hibernate会话中,然后将hibernate会话传递给DAO构造函数
我为我的DAO使用一个基本测试类,它在@Before方法中设置连接和会话
这是一把样品刀
public class ItemDAOImpl implements ItemDAO {
private final Session session;
public ItemDAOImpl(Session session) {
this.session = session;
}
public List<Item> findAll() {
return session.createCriteria(Item.class).list();
}
....
}
但是在我的测试用例中,我不需要Tapestry
public class ItemDAOImplTest extends AbstractHibernateTest {
private ItemDAO itemDAO;
@Override
protected void before() {
itemDAO = new ItemDAOImpl(session);
}
@Override
protected void after() {}
@Test
public void testFindAll() {
session.save(new Item(...));
session.save(new Item(...));
session.save(new Item(...));
assertEquals(3, itemDAO.findAll().size());
}
}
public abstract class AbstractHibernateTest {
protected SessionFactory sessionFactory;
protected Session session;
@Before
public void abstractBefore() throws Exception {
Configuration config = new Configuration();
// see PackageNameHibernateConfigurer source code to dynamically add all
// classes in the entities package
config.addAnnotatedClass(Item.class);
config.addAnnotatedClass(...);
config.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
config.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
config.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");
config.setProperty("hibernate.hbm2ddl.auto", "create");
config.setProperty("hibernate.show_sql", "true");
config.setProperty("hibernate.format_sql", "true");
sessionFactory = config.buildSessionFactory();
session = sessionFactory.openSession();
session.beginTransaction();
before();
}
protected abstract void before() throws Exception;
@After
public void abstractAfter() throws Exception {
Exception exception = null;
try {
after();
} catch (Exception e) {
exception = e;
}
session.getTransaction().rollback();
session.close();
sessionFactory.close();
if (exception != null) {
throw exception;
}
}
protected abstract void after() throws Exception;
}
如果要通过IoC运行DAO,另一个选项是将AppModule分为两个:一个用于定义Hibernate实体和DAO的模块,另一个在AppModule中。您可以使用DAO模块和HibernateCoreModule初始化测试(如果您注意到,Tapestry的Hibernate支持同样分为两部分:一部分是在Tapestry ioc上工作的非可视部分,另一部分是提供到Tapestry core的附加挂钩的可视部分)。感谢@uklance的帮助。另外,buildDefaultRegistry()没有从Tapestry core加载TapestryModule。
public class ItemDAOImplTest extends AbstractHibernateTest {
private ItemDAO itemDAO;
@Override
protected void before() {
itemDAO = new ItemDAOImpl(session);
}
@Override
protected void after() {}
@Test
public void testFindAll() {
session.save(new Item(...));
session.save(new Item(...));
session.save(new Item(...));
assertEquals(3, itemDAO.findAll().size());
}
}
public abstract class AbstractHibernateTest {
protected SessionFactory sessionFactory;
protected Session session;
@Before
public void abstractBefore() throws Exception {
Configuration config = new Configuration();
// see PackageNameHibernateConfigurer source code to dynamically add all
// classes in the entities package
config.addAnnotatedClass(Item.class);
config.addAnnotatedClass(...);
config.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
config.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
config.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");
config.setProperty("hibernate.hbm2ddl.auto", "create");
config.setProperty("hibernate.show_sql", "true");
config.setProperty("hibernate.format_sql", "true");
sessionFactory = config.buildSessionFactory();
session = sessionFactory.openSession();
session.beginTransaction();
before();
}
protected abstract void before() throws Exception;
@After
public void abstractAfter() throws Exception {
Exception exception = null;
try {
after();
} catch (Exception e) {
exception = e;
}
session.getTransaction().rollback();
session.close();
sessionFactory.close();
if (exception != null) {
throw exception;
}
}
protected abstract void after() throws Exception;
}