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

时间:2014-05-08 21:26:37

标签: java spring hibernate junit

我有一个简单的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.hibernate.exception.ConstraintViolationException       在org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:32)       在org.junit.internal.runners.statements.RunBefores.evaluate(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.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:63)       在org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)       在org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:53)       在org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)       在org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)       在org.springframework.test.context.junit4.statements.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.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)       在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)       在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)       在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)       在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)    org.hibernate.exception.ConstraintViolationException:无法执行语句       在org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(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.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)       at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190)       在org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)       在org.hibernate.persister.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 个答案:

答案 0 :(得分: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");
    }
}

希望它可以帮助某人

答案 1 :(得分:0)

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

在我的案例中帮助我的是找到javax.persistence.PersistenceException

enter image description here

答案 2 :(得分:-2)

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