Простой интеграционный тест Дао не работает - PullRequest
0 голосов
/ 10 декабря 2011

Это очень простой тест для сохранения временного объекта Person в базе данных и проверки того, что объект, сохраненный в базе данных, совпадает с временным объектом 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;
...

Первое утверждение проходит, но второене получается, я где-то делаю глупую ошибку, но не знаю где !!!

Ответы [ 2 ]

4 голосов
/ 10 декабря 2011

Первая возможная проблема

Второе утверждение не выполняется просто потому, что оно возвращает другой экземпляр Person объекта.Поскольку вы (?) Не определяете equals() / hashCode(), средство сопоставления is() завершается неудачно.

Реализуйте их (как правило, это хорошая идея для Hibernate).

Второй возможныйproblem

Первое утверждение проходит, потому что Hibernate извлек идентификатор из seq_table, но еще не сбросил саму сущность.Это означает, что объект находится в кэше первого уровня, но еще не в базе данных.Таким образом, когда вы запрашиваете базу данных напрямую, используя JDBC:

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

Запись не найдена.Вызовите flush() после сохранения объекта или запросите объект, используя JPA.Hibernate достаточно умен, чтобы flush() до запроса.

1 голос
/ 10 декабря 2011

Вы выполняете запрос SELECT *, который возвращает один объект, только если в базе данных есть одна строка.

Если запрос не возвращает ровно одну строку или не возвращает ровно один объект, выдается IncorrectResultSizeDataAccessException.

Вы уверены, что исключение не выдается?

Ваш класс Person правильно реализует equals и hashCode ? Если от них зависит метод is (), он не может быть лучше, чем позволяет ваша реализация.

...