Суть:
Как я могу автоматически откатить свою гибернационную транзакцию в тесте 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, но получение контроля над транзакциями (с началом/откатом) не сработало, я думаю, из-за всех @Transactional
, которые выполняются под капотом внутри этого вспомогательного класса.
Также я читал, что JBehave работает в другом контексте?сеансе?что-то? что вызывает потерю контроля над транзакцией, запущенной тестом? Довольно запутанная вещь..
изменить:
Отредактируйте вышеизложенное, перефразировав пост, чтобы отразить мои текущие знания, и сократив все это, чтобы вопрос стал более очевидным, а установка менее навязчивой.