Java 将JBehave与SpringJUnit4ClassRunner结合以启用事务回滚
精华: 如何在JUnit测试运行中使用JBehave自动回滚我的休眠事务 问题似乎是JBehave想要Java 将JBehave与SpringJUnit4ClassRunner结合以启用事务回滚,java,spring,hibernate,junit,jbehave,Java,Spring,Hibernate,Junit,Jbehave,精华: 如何在JUnit测试运行中使用JBehave自动回滚我的休眠事务 问题似乎是JBehave想要SpringAnnotatedEmbedderRunner,但将测试注释为@Transactional需要SpringJUnit4ClassRunner 我试图找到一些关于如何使用SpringAnnotatedEmbedderRunner实现回滚或使用SpringJUnit4ClassRunner使JBehave工作的文档,但两者都无法工作 是否有人有(最好是简单的)运行带有Spring和Hib
SpringAnnotatedEmbedderRunner
,但将测试注释为@Transactional
需要SpringJUnit4ClassRunner
我试图找到一些关于如何使用SpringAnnotatedEmbedderRunner
实现回滚或使用SpringJUnit4ClassRunner
使JBehave工作的文档,但两者都无法工作
是否有人有(最好是简单的)运行带有Spring和Hibernate以及事务自动回滚的JBehave存储库的设置
到目前为止关于我的设置的更多信息: 使用Spring工作JBehave-但不使用自动回滚:
@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);
}
}
(是,databaseSetupHelper方法都是事务性的)
PersonProvider基本上是org.springframework.data.jpa.repository.support.SimpleParepository
的包装器。因此,可以访问entityManager,但控制事务(使用begin/rollback)不起作用,我想这是因为所有的@Transactional
都是在助手类内部的后台完成的
我还读到JBehave在不同的上下文中运行?会话?什么?这会导致对测试启动的事务失去控制?相当令人困惑的东西
编辑:
编辑上面的文章,以反映我目前的知识,并缩短整个内容,使问题变得更明显,设置不那么麻烦。我不熟悉JBehave,但您似乎正在搜索此注释
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true).
您还可以在testContext中将defaultRollback设置为true 我认为您可以跳过SpringAnnotatedEmberRunner,为JBehave提供必要的配置。例如,而不是
@UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = false, ignoreFailureInView = false)
你能行
configuredEmbedder()
.embedderControls()
.doGenerateViewAfterStories(true)
.doIgnoreFailureInStories(false)
.doIgnoreFailureInView(false);
此外:为什么要回滚事务?通常,您使用JBehave进行验收测试,该测试在类似于生产的环境中运行。例如,首先在数据库中设置一些数据,通过Browser/Selenium访问数据并检查结果。为此,必须提交DB事务。您是否需要在测试后手动清理,您可以在@AfterTories或@AfterScenario注释的方法中进行清理。我通过手动控制事务范围,在每个场景后将其回滚来实现清理。只需遵循官方指南如何将Spring与JBehave一起使用,然后执行如下所示的技巧
@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());
}
}
不,那不行。这是一个
SpringJUnit4ClassRunner
注释,JBehave的SpringAnnotatedEmbedderRunner
.Hm将忽略它。。听起来我可以试试。谢谢,我将在下周查看。我们的验收测试不会针对已部署的应用程序运行,我们将其保留为端到端测试。我们的接受测试将直接针对域模型运行,包括我们想要自动回滚的干净数据库。
@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());
}
}