エッセンス:
JBehaveを使用した JUnit テストの実行で休止状態のトランザクションを自動ロールバックするにはどうすればよいですか?
問題は、JBehave がを必要としているSpringAnnotatedEmbedderRunner
のに、テストに注釈を付けるために.@Transactional
SpringJUnit4ClassRunner
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 が別のコンテキストで実行されることを読みましたか?セッション?何か? テストによって開始されたトランザクションの制御が失われる原因は何ですか? かなり紛らわしい内容..
編集:
上記を編集して、私の現在の知識を反映するように投稿を言い換え、全体を短くして、質問がより明確になり、セットアップが邪魔にならないようにします。