Тестовый блок Spring не откатывает вставку записи - PullRequest
7 голосов
/ 14 февраля 2011

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "/applicationContext-test.xml")
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
@Transactional
public class PriceRepositoryTest {

@Resource(name ="repository")
private PriceRepository repository;
@Test
public void testGetAll() throws Exception {
    Assert.assertEquals(8, repository.getAll().size());
}


@Test
@Rollback
public void shouldSaveNewArticle(){
    Article article = new Article();
    article.setName("Article");
    article.setPrice(33);
    repository.save(article);

    Assert.assertEquals(9, repository.getAll().size());
}


@Test
@Rollback
public void shouldUpdateArticle(){
    Article article = repository.getArticle(4);
    article.setPrice(33);
    repository.update(article);

    Assert.assertEquals(String.valueOf(33.0), String.valueOf(repository.getArticle(4).getPrice()));
}

}

Ответы [ 3 ]

5 голосов
/ 14 февраля 2011

Возможно, ваш DAO также помечен @Transactional?Если это так, вот в чем проблема: транзакционность на другом уровне не знает о вашей локальной конфигурации транзакций.Если repository.update(article) равно @Transactional, он может начинать или не начинать новую транзакцию (в зависимости от значения атрибута propagation), но он выполнит транзакцию после выполнения, и ваш метод тестирования не сможет ничего перехватитьчто.

Это одна из причин, по которой транзакции должны начинаться на уровне обслуживания, а не на уровне DAO.

(Если это не так, я смиренно извиняюсь)

1 голос
/ 07 февраля 2014

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

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

0 голосов
/ 22 мая 2012

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

em.persist (jpaServer); em.flush (); // фиксирует запись независимо от того, что настроено пружиной

снял флеш и подтвердил отсутствие записи. Протестировал тот же код с тестом, аннотированным @Rollback (false), и подтвердил запись (доказывая, что сброс не требовался)

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