Объединение JBehave с SpringJUnit4ClassRunner для включения отката транзакции

Суть:

Как я могу автоматически откатитьмою гибернационную транзакциюв Тестовый запуск 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 работает в другом контексте?сеансе?что-то? что вызывает потерю контроля над транзакцией, запущенной тестом? Довольно запутанный материал..


изменить:

Отредактируйте приведенный выше пост, перефразировав пост, чтобы отразить мои текущие знания, и сократив все это, чтобы вопрос стал более очевидным, а установка менее навязчивой.

9
задан Pete 15 May 2012 в 02:03
поделиться