diff --git a/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java index 978dced76e..6ae8d4bd9a 100644 --- a/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java @@ -186,6 +186,12 @@ public class TransactionalTestExecutionListener extends AbstractTestExecutionLis } tm = getTransactionManager(testContext, transactionAttribute.getQualifier()); + + if (tm == null) { + throw new IllegalStateException(String.format( + "Failed to retrieve PlatformTransactionManager for @Transactional test for test context %s.", + testContext)); + } } if (tm != null) { diff --git a/spring-test/src/test/java/org/springframework/test/context/transaction/TransactionalTestExecutionListenerTests.java b/spring-test/src/test/java/org/springframework/test/context/transaction/TransactionalTestExecutionListenerTests.java index b01fc608e8..8d4e015f27 100644 --- a/spring-test/src/test/java/org/springframework/test/context/transaction/TransactionalTestExecutionListenerTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/transaction/TransactionalTestExecutionListenerTests.java @@ -155,6 +155,38 @@ public class TransactionalTestExecutionListenerTests { TransactionContextHolder.removeCurrentTransactionContext(); } + /** + * SPR-13895 + */ + @Test + public void transactionalTestWithoutTransactionManager() throws Exception { + TransactionalTestExecutionListener listener = new TransactionalTestExecutionListener() { + + protected PlatformTransactionManager getTransactionManager(TestContext testContext, String qualifier) { + return null; + } + }; + + Class clazz = TransactionalDeclaredOnClassLocallyTestCase.class; + + BDDMockito.> given(testContext.getTestClass()).willReturn(clazz); + Invocable instance = clazz.newInstance(); + given(testContext.getTestInstance()).willReturn(instance); + given(testContext.getTestMethod()).willReturn(clazz.getDeclaredMethod("transactionalTest")); + + assertFalse(instance.invoked); + TransactionContextHolder.removeCurrentTransactionContext(); + + try { + listener.beforeTestMethod(testContext); + fail("Should have thrown an IllegalStateException"); + } + catch (IllegalStateException e) { + assertTrue(e.getMessage().startsWith( + "Failed to retrieve PlatformTransactionManager for @Transactional test for test context")); + } + } + @Test public void beforeTestMethodWithTransactionalDeclaredOnClassLocally() throws Exception { assertBeforeTestMethodWithTransactionalTestMethod(TransactionalDeclaredOnClassLocallyTestCase.class);