Транзакция распространяется из TransactionalTestExecutionListener в TestRestTemplate? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть интеграционный тест, который проверяет некоторый контроллер покоя, но после его выполнения БД изменяется и данные в нем не откатываются в конце теста, и я должен использовать @DirtiesContext для повторного запуска. Я не уверен, действительно ли это необходимо (сомневаюсь в этом), и где моя конфигурация неверна.

У меня есть интеграционный тест, помеченный:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Transactional

, и отдельные методы тестирования выглядят следующим образом:

@Test
//@DirtiesContext    
public void testPostWhatever() {

Этот тест просто создает некоторые данные запроса, вызывает post, который, в свою очередь, сохраняет данные в БД. Затем мы используем запрос GET, чтобы выяснить, можем ли мы найти эти данные. Trivial. Согласно javadoc, по умолчанию этот тест должен быть транзакционным и должен откатывать транзакцию, открытую для теста. Когда я включаю запись в спящий режим, я вижу, что TX создан для тестового метода:

2019-10-01 18:01:59.094 o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [somePackage.TestClass.testMethod]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

Я вижу, как вызывается контроллер, я вижу, что его TX создан и что TX используется повторно

2019-10-01 18:01:59.663 o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [somePackage.SomeService.someMethod]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

2019-10-01 18:01:59.674 o.s.orm.jpa.JpaTransactionManager        : Participating in existing transaction

и тогда я вижу, что коммит называется:

2019-10-01 18:02:00.286 o.s.orm.jpa.JpaTransactionManager        : Committing JPA transaction on EntityManager [SessionImpl(341270043<open>)]
2019-10-01 18:02:00.286 o.h.e.t.internal.TransactionImpl         : committing

и затем откатывается:

2019-10-01 18:02:00.304 o.s.orm.jpa.JpaTransactionManager        : Rolling back JPA transaction on EntityManager [SessionImpl(1723900181<open>)]
2019-10-01 18:02:00.304 o.h.e.t.internal.TransactionImpl         : rolling back
2019-10-01 18:02:00.305 o.s.orm.jpa.JpaTransactionManager        : Closing JPA EntityManager [SessionImpl(1723900181<open>)] after transaction

Теперь я не знаю, как должен работать тест. Tx открывается в методе test, test и service, который имеет ТРЕБУЕМЫЕ распространения tx, и в журналах предполагается, что тестовый TX повторно используется для контроллера (в противном случае я бы не понял, в какой службе tx участвует). С другой стороны, последний откат метода теста не позволяет откатить изменения, сохраненные службой, а вставленные записи «выживают» и присутствуют в другом тесте.

Вопрос : передается ли TX из TransactionalTestExecutionListener в остальноеконтроллер вызывается через TestRestTemplate? А) если он распространяется, что я делаю не так, чтобы данные не откатывались? Б) если он не распространяется, правильно ли использовать @DirtiesContext? (на самом деле я бы хотел избежать этого из-за влияния времени тестирования и некоторых других проблем).

версия для Springboot: 2.1.8.RELEASE

...