Spring + Hibernate: инициализация базы данных с помощью JUnit не работает - PullRequest
1 голос
/ 28 декабря 2011

У меня есть простая база данных с одной таблицей транспортных средств (с использованием MySQL):

create table vehicle (
    vehicle_no varchar(10) not null,
    color varchar(10),
    wheel int,
    seat int,
    primary key (vehicle_no)
) engine = InnoDB;

В Java у меня есть объект DAO, который должен запрашивать все транспортные средства (другие методы DAO опущены).Этот DAO должен присоединиться к существующей транзакции или создать новую при необходимости:

@Transactional(propagation=Propagation.REQUIRED, readOnly=false)
public class HibernateVehicleDao implements VehicleDao {

    private SessionFactory sessionFactory;
    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public List<Vehicle> findAll() {
        return currentSession().createQuery("from Vehicle").list();
    }
}

Теперь я написал тест JUnit (JUnit4) для DAO.Перед запуском метода испытаний он должен добавить 10 баз данных в базу данных, а после запуска удалить все машины.Я отдельно протестировал это поведение с Spring JDBC, и все работает правильно, поэтому проблем не должно быть.

@ContextConfiguration(locations = "/sk/xorty/dataaccess/dataaccess-beans.xml")
public class HibernateVehicleDaoTest extends AbstractTransactionalJUnit4SpringContextTests {

    private static final int COUNT = 10;

    @Autowired
    @Qualifier("hibernateVehicleDao")
    private VehicleDao dao;

    @Before
    public void setUp() {
        String insert = 
                "INSERT INTO VEHICLE (VEHICLE_NO, COLOR, WHEEL, SEAT) VALUES (?, ?, ?, ?)";
        List<Object[]> argsList = new ArrayList<>();
        for (int i = 0; i < COUNT; i++) {
            argsList.add(VehicleUtil.nextVehicleArgs());
        }
        simpleJdbcTemplate.batchUpdate(insert, argsList);
    }

    @After
    public void tearDown() {
        simpleJdbcTemplate.update("DELETE FROM VEHICLE", (Object[]) null);
    }

    @Test
    public void testFindAll() {
        assertEquals (COUNT, dao.findAll().size());
    }
}

Все загружается, поэтому я подозреваю, что конфигурация правильная и зависимости былиправильно введен.

Проблема в , этот тест не пройден, потому что база данных пуста (нет транспортных средств).Когда я вставляю их вручную, они никогда не удаляются с другой стороны.

Пожалуйста, попробуйте обратить внимание на использование транзакционных аннотаций , я довольно новичок в этом и думаю, что могошибка где-то там.

Вот мой файл конфигурации бина, если это может помочь*

1 Ответ

0 голосов
/ 28 декабря 2011

Я не уверен, имеет ли это значение, но неправильный регистр в следующем методе:

@Override
public List<Vehicle> findAll() {
    return currentSession().createQuery("from Vehicle").list();
}

Имя таблицы начинается со строчной буквы v в «vehicle», тогда как в этом методе используется прописная буква «V».

Еще одна интересная вещь, которую я прочитал из документации:

simpleJdbcTemplate: полезно для запроса подтверждения состояния.Например, вы можете выполнить запрос до и после тестирования кода приложения, который создает объект и сохраняет его с помощью инструмента ORM, чтобы убедиться, что данные появляются в базе данных.(Spring гарантирует, что запрос выполняется в рамках одной и той же транзакции.) Вам необходимо указать инструменту ORM «сбросить» свои изменения, чтобы это работало правильно, например, с помощью метода flush () в интерфейсе Siber Hibernate.

Попробуйте очистить сеанс перед выполнением запроса.

...