지난번에는 PizzaApp 클래스에서 새로운 피자 객체를 만들고 save()를 사용해서 DB에 insert를 했었습니다.

이번에는 PizzaTest 클래스를 만들고 JUnit을 사용해 봅니다. save()를 사용해서 DB에 피자 한판을 넣어보고 들어갔는지 빼내어 보고 빼낸 것이 null이 아닌지 확인해 봅니다.

연습용이기 때문에 test가 별로 맘에 안드실 수도 있습니다. 저도 별로 테스트가 맘에 들지 않지만 DB에서 데이타를 꺼내오고 JUnit 형태로 만들어 보는것에 목적을 뒀습니다.

public class PizzaTest {

 

       private Session s;

 

       private Transaction tx;

 

       @Before

       public void createSession() {

             ApplicationContext ac = new ClassPathXmlApplicationContext(

                           new String[] { "applicationContext-dao.xml",

                                        "applicationContext-jdbc-datasource.xml" });

             SessionFactory sf = (SessionFactory) ac.getBean("sessionFactory");

 

             s = sf.openSession();

             tx = s.beginTransaction();

       }

 

       @Test

       public void createPizza() {

             Pizza p = new Pizza();

             p.setName("keesun's 2007 pizza");

             p.setPrice(2007);

             p.setToping("happiness");

             p.setSize("2007cm");

 

             s.save(p);

 

             List pizzaList =  s.createQuery("from O_Pizza").list();

             assertNotNull(pizzaList);

       }

 

       @After

       public void close() {

             tx.commit();

             s.close();

       }

}

오.. 잘 돌아갑니다. O_Pizza는 실제 table에는 o_pizza 이렇게 소문자로 들어가 있습니다. postgres 특징인것 같습니다. 하지만 프로그램에서도 o_pizza 이렇게 쓰면 다음과 같은 에러를 볼 수 있습니다.

[#M_ more.. | less.. |
org.hibernate.hql.ast.QuerySyntaxException: o_pizza is not mapped [from o_pizza]
 at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
 at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
 at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
 at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:257)
 at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
 at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
 at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
 at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
 at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
 at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
 at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
 at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
 at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
 at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
 at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
 at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
 at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
 at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
 at model.PizzaTest.createPizza(PizzaTest.java:43)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
 at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
 at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
 at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
 at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
 at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
 at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
 at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
 at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
 at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)_M#]

DB의 table이름을 쓰지 말고 @Entity의 name속성에 지정한 이름으로 사용해야 합니다.