简体   繁体   English

如何在JUnit4中使用hibernate测试DAO

[英]How to test DAOs using hibernate in JUnit4

This seems to be a similar question ( Test DAO in java using Junit4 and Hibernate ), but he's getting the session created successfully. 这似乎是一个类似的问题( 使用Junit4和Hibernate在java中测试DAO ),但他正在成功创建会话。 I'm unable to create the session. 我无法创建会话。

Please note that I'm not using Spring. 请注意,我没有使用Spring。 I just need to test my DAOs which create sessions using HibernateUtil.java 我只需要测试使用HibernateUtil.java创建会话的DAO

My Sample Test Code (in test packages) 我的样本测试代码(在测试包中)

public void testGetBean() {
    System.out.println("getBean");
    int idaccount = 0;
    Account expResult = null;
    Account result = DAOAccount.getBean(idaccount);
    assertEquals(expResult, result);
    // TODO review the generated test code and remove the default call to fail.
    //fail("The test case is a prototype.");
}

And here is DAOAccount getBean() (in source packages) 这里是DAOAccount getBean()(在源包中)

public static Account getBean(int idaccount) {
    Account ac = null;
    Session sess = NewHibernateUtil.getSessionFactory().openSession();
    Transaction tx = sess.beginTransaction();
    Query q = sess.createQuery("from Account where idaccount=:id");
    q.setInteger("id", idaccount);
    ac = (Account) q.uniqueResult();
    tx.commit();
    sess.close();
    return ac;
}

NewHibernateUtil.java (in source packages) NewHibernateUtil.java(在源包中)

public class NewHibernateUtil {
private static final SessionFactory sessionFactory;

static {
    try {
        // Create the SessionFactory from standard (hibernate.cfg.xml) 
        // config file.
//            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        sessionFactory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
        // Log the exception. 
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}

and here is the stack trace 这是堆栈跟踪 在此输入图像描述

Below is the project structure : 以下是项目结构:

在此输入图像描述

Actual Exception Stacktrace as asked by @Subin @Subin提出的实际异常Stacktrace

[2012-12-29 16:36:24.347] [ INFO] Configuration.applyHibernateValidatorLegacyConstraintsOnDDL:1646 - Hibernate Validator not found: ignoring
Initial SessionFactory creation failed.java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
    at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:170)
    at org.hibernate.cfg.beanvalidation.BeanValidationActivator.applyDDL(BeanValidationActivator.java:103)
    at org.hibernate.cfg.Configuration.applyBeanValidationConstraintsOnDDL(Configuration.java:1674)
    at org.hibernate.cfg.Configuration.applyConstraintsToDDL(Configuration.java:1624)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1415)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1826)
    at dao.NewHibernateUtil.<clinit>(NewHibernateUtil.java:25)
    at dao.DAOAccount.getAccounts(DAOAccount.java:77)
    at dao.DAOAccountTest.testGetAccounts_User(DAOAccountTest.java:78)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at junit.framework.TestCase.runTest(TestCase.java:176)
    at junit.framework.TestCase.runBare(TestCase.java:141)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:129)
    at junit.framework.TestSuite.runTest(TestSuite.java:255)
    at junit.framework.TestSuite.run(TestSuite.java:250)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)

public Configuration configure() throws HibernateException Use the mappings and properties specified in an application resource named hibernate.cfg.xml. public配置configure()throws HibernateException使用名为hibernate.cfg.xml的应用程序资源中指定的映射和属性。 Throws: HibernateException 抛出:HibernateException

Configuration.configure() will work correctly only if hibernate.cfg.xml is available as application resource. 仅当hibernate.cfg.xml可用作应用程序资源时, Configuration.configure()才能正常工作。 or classpath. 或类路径。

If you are using eclipse to invoke your Junit test, add hibernate.cfg.xml to classpath, since you are using maven do you have it in src/main/resources 如果您使用eclipse来调用Junit测试,请将hibernate.cfg.xml添加到classpath,因为您正在使用maven,您是否在src / main / resources中使用它

Please see this link to see, why java.lang.ClassFormatError: happens. 请参阅此链接以了解为什么java.lang.ClassFormatError:发生。 Maven: hibernate-entitymanager together with javaee-api break my unit tests Maven:hibernate-entitymanager和javaee-api一起打破了我的单元测试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM