我有一个简单的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 回答
好吧所以我设法通过测试这里是代码片段,关键是捕获此异常,清除会话,然后重新抛出它
希望它能帮到某个人
我有同样的问题 . 捕获
org.hibernate.exception.ConstraintViolationException
什么都不会捕获,尽管所有测试都失败了,因为抛出了这个异常 - 至少这是IDE乍看之下所说的 .是什么帮助了我我的情况是要 grab
javax.persistence.PersistenceException
.你失败了,因为你告诉junit期望一个ConstraintViolationException,你的测试中调用的方法不会抛出它 . 测试本身有一些问题,但上面是它失败的原因......看看堆栈跟踪的第一行 .