首页 文章

无法通过hibernate传递uniqueConstraintException的junit测试

提问于
浏览
1

我有一个简单的User类,它有名字,姓氏和电子邮件,我已经标记了这样的电子邮件

@Column(name="email",unique=true)
@NotNull
@Email
private String email;

我运行以下junit测试,但它失败了

@Test(expected = org.hibernate.exception.ConstraintViolationException.class)  
public void testUniqueEmail() throws DaoException{
    User uri = new User("uri","naor","a@b.com");
    userDao.saveUser(uri);
    //Session session = sessionFactory.getCurrentSession();
    //session.save(uri);
    //session.flush();  
    User clone = new User("clone","wars","a@b.com");
    userDao.saveUser(clone);
    //session.save(clone);
    //session.flush();
}

香港专业教育学院尝试使用userDao或直接使用会话,所以我可以冲洗任何一种方式junit失败说

java.lang.AssertionError:org.junit.internal.runners.statements.RunBefores上的org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32)中的预期异常:org.hibernate.exception.ConstraintViolationException评估(RunBefores.java:26)在org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)在org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java :27)在org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)在org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)在Org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)org.junit.runners.ParentRunner $ 3 .run(ParentRunner.java:238)在org.jun it.runners.ParentRunner $ 1.schedule(ParentRunner.java:63)org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:53) at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)org.jun.in.RonBefores.evaluate(RunBefores.java:26)org.springframework.test.context.junit4上的org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) . 语句.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)org.junit.runners.ParentRunner.run(ParentRunner.java: 309)在org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)在org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)在org.eclipse org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run中的.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)测试(RemoteTestRunner.java:467)维持在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) . java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)org.hibernate.exception.ConstraintViolationException:无法在org.hibernate.exception.internal.SQLExceptionTypeDelegate执行语句 . 转换(SQLExceptionTypeDelegate.java:72)在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)在组织位于org.hibernate.engine.jdbc.batch的org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190)中的.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) org.hibernate.p中的.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) ersister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124)在org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3587)在org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java: 103)

我怎样才能通过这个测试

*编辑似乎我的问题不是很清楚我的模型有一个名为email的字段是唯一的,所以我希望当我插入一个具有相同电子邮件的对象时,DB应该拒绝它 .

为了测试它,我做了一个简单的测试,用一个电子邮件“a@b.com”来保存一个对象,然后使用相同的电子邮件创建另一个对象 . 问题出在JUNIT上,因为测试失败是由于ConstraintViolationException正如预期的那样,但测试是RED

3 回答

  • 1

    好吧所以我设法通过测试这里是代码片段,关键是捕获此异常,清除会话,然后重新抛出它

    @Test(expected = org.hibernate.exception.ConstraintViolationException.class)  
    public void testUniqueEmail() throws DaoException{
        User uri = new User("uri","naor","a@b.com");
        userDao.saveUser(uri);
        User clone = new User("clone","wars","a@b.com");
        userDao.saveUser(clone);
        try{
            sessionFactory.getCurrentSession().flush();
        }catch(org.hibernate.exception.ConstraintViolationException ex){
            sessionFactory.getCurrentSession().clear();
            SQLException ex1= new SQLException();
            throw new ConstraintViolationException("Could not insert",ex1,"what else");
        }
    }
    

    希望它能帮到某个人

  • -2

    我有同样的问题 . 捕获 org.hibernate.exception.ConstraintViolationException 什么都不会捕获,尽管所有测试都失败了,因为抛出了这个异常 - 至少这是IDE乍看之下所说的 .

    是什么帮助了我我的情况是要 grab javax.persistence.PersistenceException .

    enter image description here

  • 0

    你失败了,因为你告诉junit期望一个ConstraintViolationException,你的测试中调用的方法不会抛出它 . 测试本身有一些问题,但上面是它失败的原因......看看堆栈跟踪的第一行 .

相关问题