9

エッセンス:

JBehaveを使用した JUnit テストの実行で休止状態のトランザクションを自動ロールバックするにはどうすればよいですか?

問題は、JBehave がを必要としているSpringAnnotatedEmbedderRunnerのに、テストに注釈を付けるために.@TransactionalSpringJUnit4ClassRunner

SpringAnnotatedEmbedderRunnerを使用してロールバックを実装する方法、または を使用して JBehave を動作させる方法に関するドキュメントを見つけようとしましたが、SpringJUnit4ClassRunnerどちらも動作させることができませんでした。

Spring と Hibernate およびトランザクションの自動ロールバックで JBehave ストーリーを実行する (できれば単純な) セットアップを持っている人はいますか?



これまでのセットアップに関する詳細情報:

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です。@Transactionalしたがって、entityManager へのアクセスはありますが、(begin/rollback を使用して) トランザクションを制御することは機能しませんでした。そのヘルパー クラス内のフードの下で行われるすべての s のためだと思います。

また、JBehave が別のコンテキストで実行されることを読みましたか?セッション?何か? テストによって開始されたトランザクションの制御が失われる原因は何ですか? かなり紛らわしい内容..


編集:

上記を編集して、私の現在の知識を反映するように投稿を言い換え、全体を短くして、質問がより明確になり、セットアップが邪魔にならないようにします。

4

3 に答える 3

2

SpringAnnotatedEmbedderRunnerをスキップして、必要な構成をJBehaveに提供できると思います。たとえば、代わりに

@UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = false, ignoreFailureInView = false)

できるよ

configuredEmbedder()
.embedderControls()
.doGenerateViewAfterStories(true)
.doIgnoreFailureInStories(false)
.doIgnoreFailureInView(false);

さらに、なぜトランザクションをロールバックしたいのですか?通常、本番環境のような環境で実行される受け入れテストにJBehaveを使用しています。たとえば、最初にデータベースにいくつかのデータを設定し、ブラウザ/セレンを介してそのデータにアクセスし、結果を確認します。そのためには、DBトランザクションをコミットする必要があります。テスト後に手動でクリーンアップする必要がありますか。これは、@AfterStoriesまたは@AfterScenarioの注釈付きメソッドで実行できます。

于 2012-06-22T08:36:23.000 に答える
2

トランザクション スコープを手動で制御し、シナリオごとにロールバックすることで機能させました。JBehave で Spring を使用する方法の公式ガイドに従って、以下に示すようにトリックを実行してください。

@Component
public class MySteps
{
    @Autowired
    MyDao myDao;

    @Autowired
    PlatformTransactionManager transactionManager;

    TransactionStatus transaction;

    @BeforeScenario
    public void beforeScenario() {
        transaction = transactionManager.getTransaction(new DefaultTransactionDefinition());
    }

    @AfterScenario
    public void afterScenario() {
        if (transaction != null)
            transactionManager.rollback(transaction);
    }

    @Given("...")
    public void persistSomething() {
        myDao.persist(new Foo());
    }
}
于 2014-07-09T21:34:22.807 に答える
1

JBehave には詳しくありませんが、この注釈を探しているようです。

@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true).

testContext で defaultRollback を true に設定することもできます。

于 2012-05-14T14:18:24.487 に答える