我有一个简单的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
答案 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
。
答案 2 :(得分:-2)
你失败是因为你告诉junit期望一个ConstraintViolationException并且你的测试中调用的方法不会抛出它。测试本身有一些问题,但上面是它失败的原因......看看堆栈跟踪的第一行。