Как правильно проверить наличие ограничений в спящем режиме? - PullRequest
1 голос
/ 21 апреля 2010

Я пытаюсь протестировать отображения Hibernate, в частности, уникальное ограничение. Мой POJO отображается следующим образом:

<property name="name" type="string" unique="true" not-null="true" />

Что я хочу сделать, это проверить, что я не могу сохранить две сущности с одинаковыми именами:

public class ExpertiseAreaDAOTest{
    private ExpertiseAreaDAO ead;
    static Connection c;
    private static SessionFactory sessionFactory;

    static {
        Configuration config = new Configuration().configure("resources/exp/hibernate-test.cfg.xml");
        sessionFactory = config.buildSessionFactory();
    }

    @Test(expected=ConstraintViolationException.class)
    public void testPersistTwoExpertiseAreasWithTheSameNameIsNotAllowed(){
        ExpertiseArea ea = new ExpertiseArea("Design");
        ExpertiseArea otherEA = new ExpertiseArea("Design");

        ead.setSession(getSessionFactory().getCurrentSession());
        ead.getSession().beginTransaction();
        ead.makePersistent(ea);
        ead.makePersistent(otherEA);
        ead.getSession().getTransaction().commit(); 
    }

    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }
}
//Other methods ommited

После совершения текущей транзакции я вижу в журналах, что выбрасывается ConstraintViolationException:

16:08:47,571 DEBUG SQL:111 - insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
Hibernate: insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
16:08:47,571 DEBUG SQL:111 - insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
Hibernate: insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)
16:08:47,572  WARN JDBCExceptionReporter:100 - SQL Error: -104, SQLState: 23505
16:08:47,572 ERROR JDBCExceptionReporter:101 - integrity constraint violation: unique constraint or index violation; SYS_CT_10036 table: EXPERTISEAREA
16:08:47,573 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

Таким образом, я ожидаю, что тест пройдёт, поскольку выдается ожидаемое исключение ConstraintViolationException. Тем не менее, тест никогда не завершается (ни проходит, ни терпит неудачу), и я должен вручную убить бегуна теста.

Как правильно это проверить?

1 Ответ

2 голосов
/ 21 апреля 2010

Разве вы не должны запускать create в двух транзакциях, ожидая, что первая будет успешной, а вторая - неудачной?

public void testPersistTwoExpertiseAreasWithTheSameNameIsNotAllowed(){
    ExpertiseArea ea = new ExpertiseArea("Design");
    ExpertiseArea otherEA = new ExpertiseArea("Design");

    SessionFactory sf = getSessionFactory();
    Session session = sf.openSession();
    Transaction txn = session.beginTransaction();
    try {
        ead.setSession(session);
        ead.makePersistent(ea);
        // no ExpertiseArea by this name in DB, this should commit
        txn.commit(); 
    } catch (HibernateException ex) {
        txn.rollback();
        fail("Unexpected exception " + ex);
    } finally {
        session.close();
        ead.setSession(null);
    }
    session = sf.openSession();
    txn = session.beginTransaction();
    try {
        ead.setSession(session);
        ead.makePersistent(otherEA);
        // this should fail 'cos there is already an ExpertiseArea with
        // the same name in DB
        txn.commit();
        fail("Expected constraint violation exception");
    } finally {
        session.close();
        ead.setSession(null);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...