Суть:
Как я могу автоматически откатитьмою гибернационную транзакциюв Тестовый запуск JUnit с JBehave?
Проблема заключается в том, что JBehave нужен SpringAnnotatedEmbedderRunner
, но для аннотирования теста как @Transactional
требуется SpringJUnit4ClassRunner
.
Я пытался найти документацию о том, как реализовать либо откат с помощью SpringAnnotatedEmbedderRunner
, либо заставить JBehave работать с помощью SpringJUnit4ClassRunner
, но мне не удалось заставить работать ни то, ни другое.
Есть ли у кого-нибудь установка (желательно простая), которая запускает истории JBehave с Spring и Hibernate и автоматическим откатом транзакций?
Дополнительная информация о моей настройке на данный момент:
Работа JBehave с Spring, но не с автоматическим откатом:
@RunWith(SpringAnnotatedEmbedderRunner.class)
@Configure(parameterConverters = ParameterConverters.EnumConverter.class)
@UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = false, ignoreFailureInView = false)
@UsingSpring(resources = { "file:src/main/webapp/WEB-INF/test-context.xml" })
@UsingSteps
@Transactional // << won't work
@TransactionConfiguration(...) // << won't work
// both require the SpringJUnit4ClassRunner
public class DwStoryTests extends JUnitStories {
protected List<String> storyPaths() {
String searchInDirectory = CodeLocations.codeLocationFromPath("src/test/resources").getFile();
return new StoryFinder().findPaths(searchInDirectory, Arrays.asList("**/*.story"), null);
}
}
В моих тестовых шагах я могу @Inject
все хорошо:
@Component
@Transactional // << won't work
public class PersonServiceSteps extends AbstractSmockServerTest {
@Inject
private DatabaseSetupHelper databaseSetupHelper;
@Inject
private PersonProvider personProvider;
@Given("a database in default state")
public void setupDatabase() throws SecurityException {
databaseSetupHelper.createTypes();
databaseSetupHelper.createPermission();
}
@When("the service $service is called with message $message")
public void callServiceWithMessage(String service, String message) {
sendRequestTo("/personService", withMessage("requestPersonSave.xml")).andExpect(noFault());
}
@Then("there should be a new person in the database")
public void assertNewPersonInDatabase() {
Assert.assertEquals("Service did not save person: ", personProvider.count(), 1);
}
( да, все методы databaseSetupHelper являются транзакционными)
PersonProvider в основном представляет собой оболочку вокруг org.springframework.data.jpa.repository.support.SimpleJpaRepository
. Таким образом, есть доступ к entityManager, но получение контроля над транзакциями (с помощью begin/rollback) не сработало, я думаю, из-за всех @Transactional
, которые выполняются под капотом внутри этого вспомогательного класса.
Также я читал, что JBehave работает в другом контексте?сеансе?что-то? что вызывает потерю контроля над транзакцией, запущенной тестом? Довольно запутанный материал..
изменить:
Отредактируйте приведенный выше пост, перефразировав пост, чтобы отразить мои текущие знания, и сократив все это, чтобы вопрос стал более очевидным, а установка менее навязчивой.