Java 一个简单的Dao集成测试不起作用
这是一个非常简单的测试,用于在数据库中持久化一个临时Person对象,然后验证该对象是否保存在数据库中 数据库与临时人员对象相同。 考试开始了Java 一个简单的Dao集成测试不起作用,java,hibernate,spring,tdd,hibernate-generic-dao,Java,Hibernate,Spring,Tdd,Hibernate Generic Dao,这是一个非常简单的测试,用于在数据库中持久化一个临时Person对象,然后验证该对象是否保存在数据库中 数据库与临时人员对象相同。 考试开始了 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/daoIntegration-test.xml") @Transactional public class HibernatePersonDaoIntegrationTest { @Autowired priva
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/daoIntegration-test.xml")
@Transactional
public class HibernatePersonDaoIntegrationTest {
@Autowired
private PersonDao PersonDao;
@Autowired
private SessionFactory sessionFactory;
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void shouldSavePerson() {
//Given
Person person = new Person();
//When
PersonDao.savePerson(person);
//Then ----THIS ASSERTION PASSES!!!
assertThat(person.getId(), notNullValue());
//And ----THIS ONE FAILS!!!
Person persistedPerson = jdbcTemplate.queryForObject("select * from table_Person", Person.class);
assertThat(persistedPerson, is(person));
}
My-test.xml
<jdbc:embedded-database id="dataSource" type="HSQL"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="packagesToScan" value="com.domain"/>
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
第一个断言通过了,但第二个断言失败了,我在某处犯了一个愚蠢的错误,但不知道在哪里 您正在执行一个
SELECT*
查询,该查询仅在数据库中有一行时返回一个对象
如果查询没有只返回一行,或者没有只返回一个对象,则会抛出一个IncorrectResultSizeDataAccessException
您确定没有引发异常吗
Person类是否实现了equals和hashCode?如果is()方法依赖于这些,那么它不会比您的实现所允许的更好。您正在执行一个
SELECT*
查询,该查询仅在数据库中有一行时返回一个对象
如果查询没有只返回一行,或者没有只返回一个对象,则会抛出一个IncorrectResultSizeDataAccessException
您确定没有引发异常吗
Person类是否实现了equals和hashCode?如果is()方法依赖于这些,那么它不会比您的实现所允许的更好。第一个可能的问题
第二个断言失败仅仅是因为它返回了Person
对象的不同实例。由于没有(?)定义equals()
/hashCode()
,因此is()
匹配器失败
实现它们(使用Hibernate通常是一个好主意)
第二个可能的问题
第一个断言通过,因为Hibernate从seq_table
获取了id,但尚未刷新实体本身。这意味着实体在一级缓存中,但尚未在数据库中。因此,当您直接使用JDBC查询数据库时:
jdbcTemplate.queryForObject("select * from table_Person", Person.class);
找不到该记录。保存实体后调用flush()
,或使用JPA查询对象。Hibernate足够聪明,可以在查询之前flush()
。第一个可能的问题
第二个断言失败仅仅是因为它返回了Person
对象的不同实例。由于没有(?)定义equals()
/hashCode()
,因此is()
匹配器失败
实现它们(使用Hibernate通常是一个好主意)
第二个可能的问题
第一个断言通过,因为Hibernate从seq_table
获取了id,但尚未刷新实体本身。这意味着实体在一级缓存中,但尚未在数据库中。因此,当您直接使用JDBC查询数据库时:
jdbcTemplate.queryForObject("select * from table_Person", Person.class);
找不到该记录。保存实体后调用
flush()
,或使用JPA查询对象。Hibernate足够聪明,可以在查询之前flush()
。person和persistedPerson是两个不同的实例,因此它们并不相等。它们可能是等价的。e、 g Person.ID=persistedPerson.ID等。您可以重写Person类的equals运算符,但鉴于您尚未重写equals运算符,因此检查一些Person属性可能是最好的。我重写了equals和hashcode,问题在于该实体未保存在数据库中,刷新它解决了@Tomaszperson和persistedPerson所建议的问题,这是两个不同的实例,因此它们并不相等。它们可能是等价的。e、 g Person.ID=persistedPerson.ID等。您可以重写Person类的equals运算符,但鉴于您尚未重写equals运算符,因此检查一些Person属性可能是最好的。我重写了equals和hashcode,问题在于该实体未保存在数据库中,冲洗它解决了@Tomasz建议的问题