java - 一个简单的 Dao 集成测试不起作用

标签 java hibernate spring tdd hibernate-generic-dao

这是一个非常简单的测试,关于在数据库中持久保存一个临时的 Person 对象,然后验证该对象是否保存在 数据库与 transient Person 对象相同。 测试开始了

@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));
    }

我的 daoIntegration-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>

域类是:

@Entity
@Table(name="table_Person")
public class Person {

    @Id
    @TableGenerator(name = "seq_table", table = "GENERATOR_TABLE")
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "seq_table")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    private Long id;
    private String personFirstName;
...

第一个断言通过,但第二个断言失败,我在某个地方犯了一个愚蠢的错误,但不知道在哪里!!!

最佳答案

第一个可能的问题

第二个断言失败只是因为它返回 Person 对象的不同实例。由于您没有(?)定义 equals()/hashCode(),因此 is() 匹配器失败。

实现它们(对于 Hibernate 这通常是一个好主意)。

第二个可能的问题

第一个断言通过,因为 Hibernate 从 seq_table 获取了 id,但尚未刷新实体本身。这意味着该实体位于一级缓存中,但尚未位于数据库中。因此,当您直接使用 JDBC 查询数据库时:

jdbcTemplate.queryForObject("select * from table_Person", Person.class);

未找到该记录。保存实体后调用 flush() 或使用 JPA 查询对象。 Hibernate 足够聪明,可以flush() 预先查询。

关于java - 一个简单的 Dao 集成测试不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8457039/

相关文章:

java - 将整数读入二维数组

java - 项目未正确添加到 arrayList

java - 当我使用@Transactional时hibernateFilter。是必然的吗?

java - 如何控制 Spring bean 创建的顺序?

spring - 从 thymeleaf 电子邮件模板访问应用程序上下文 bean

java - 如何使用java创建一个用于发送post请求的http客户端

java - GAE : 30-40 Second Queries to Cloud SQL

database - 为 PostgreSQL 表中的(非 ID 列)自动生成唯一编号

java - Spring Data Rest 2.0.0.RELEASE 打破了以前使用 RC1 的代码

java - 意外错误