Как заставить методы в UserService фиксировать свои транзакции при возврате метода, чтобы тестовый код генерировал исключение как есть?
Поскольку @DataJpaTest
само по себе @Transactional
. Код, написанный в методе @Test
, выполняется внутри транзакции. Вы можете изменить его, используя Propogation.NOT_SUPPORTED which
Выполнить без транзакций, приостановить текущую транзакцию, если она существует
@Test
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void testCreateInvitation() {
// your test method body unchanged
}
Используя это, вы должны получить исключение при втором userService.sendInvitation(company, email);
вызове.
Также есть несколько других опций.
Вариант 1:
Добавьте @Commit
к вашему методу испытаний.
Все тесты, отмеченные @Transactional
, откатываются после его выполнения. Но с Hibernate есть одна тонкая вещь: он может отложить выполнение sql, пока вы не совершите транзакцию (или не вызовете flush
явно (вариант 2)).
Поскольку транзакция откатана, вставки не выполняются, следовательно, нет нарушения ограничения.
Помните, что с помощью @Commit
вы получите исключение вне вашего метода испытаний.
Вариант 2:
Руководство по эксплуатации flush()
:
Если ваш репозиторий extends JpaRepository<>
:
@Test
public void testCreateInvitation() {
// create first invitation,
// create second invitation
invitationRepository.flush();
}
В противном случае введите EntityManager
и наберите на нем flush()
:
@PersistenceContext
private EntityManager em;
@Test
public void testCreateInvitation() {
// create first invitation,
// create second invitation
em.flush();
}
Вы получите исключение, когда invitationRepository.flush()
или em.flush()
позвонит.
Вариант 3:
Использовать GenerationType.IDENTITY:
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
Hibernate должен назначить идентификатор для @Entity
после того, как вы save()
его. Но он не может получить идентификатор для сущности без выполнения insert
.
приписка
Меня смущает одна вещь.
Вы используете @Transactional(propagation = Propagation.REQUIRES_NEW)
, и это должно заставить совершить транзакцию после выполнения метода. Пожалуйста, проверьте ваши журналы, чтобы увидеть, если транзакции действительно работают.