Модульные тесты Hibernate - Сброс схемы - PullRequest
2 голосов
/ 26 апреля 2010

Я тестирую операции CRUD моих DAO в тестах JUnit. Когда я выполняю одиночный тест, Hibernate всегда сбрасывает схему и заполняет БД в известном состоянии. Но когда я выполняю несколько тестов в строке , Hibernate сбрасывает схему один раз, а затем данные накапливаются во время выполнения тестов.

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

Какие-нибудь советы?

Спасибо

Ответы [ 2 ]

3 голосов
/ 27 апреля 2010

Прежде всего то, что вы делаете, это не модульное тестирование, а тестирование интеграции.

Советы:

  • Используйте транзакции и откатывайтесь назад.
  • Подумайте об использовании DBUnit (не уверен, насколько это будет полезно в вашем случае).
  • Вот соответствующий код из org.springframework.orm.hibernate3.LocalSessionFactoryBean.

...

Connection con = session.connection();
Dialect dialect = Dialect.getDialect(getConfiguration().getProperties());
String[] sql = getConfiguration().generateSchemaCreationScript(dialect);
executeSchemaScript(con, sql);
1 голос
/ 27 апреля 2010

Вы можете начать транзакцию раньше и откатить транзакцию для каждого @Test метода, например, так:

public class HibernateIntegrationTest {
    protected static SessionFactory factory;
    protected Session session;

    @BeforeClass
    public static void createSessionFactory() {
        AnnotationConfiguration config = new AnnotationConfiguration();
        // ...
        config.configure();
        factory = config.buildSessionFactory();
    }    
    @AfterClass
    public static void closeSessionFactory() {
        if (factory != null) {
            factory.close();
        }
    }
    @Before
    public void beginTransaction() {
        session = factory.getCurrentSession();
        session.beginTransaction();
    }
    @After
    public void rollbackTransaction() {    
        if (session.getTransaction().isActive()) {
            session.getTransaction().rollback();
        }
        if (session.isOpen()) {
            session.close();
        }
    }
}

И расширить этот класс в ваших тестовых классах.

public class DemoTest extends HibernateIntegrationTest {
    @Test
    public void createMyEntity() {
        MyEntity e = new MyEntity();
        //...
        session.save(e);

        assertNotNull(e.getId());
    }
}

Обратите внимание, что это не самый чистый способ сделать это, приведенный выше код предназначен скорее для демонстрационных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...