Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JBehave与SpringJUnit4ClassRunner结合以启用事务回滚_Java_Spring_Hibernate_Junit_Jbehave - Fatal编程技术网

Java 将JBehave与SpringJUnit4ClassRunner结合以启用事务回滚

Java 将JBehave与SpringJUnit4ClassRunner结合以启用事务回滚,java,spring,hibernate,junit,jbehave,Java,Spring,Hibernate,Junit,Jbehave,精华: 如何在JUnit测试运行中使用JBehave自动回滚我的休眠事务 问题似乎是JBehave想要SpringAnnotatedEmbedderRunner,但将测试注释为@Transactional需要SpringJUnit4ClassRunner 我试图找到一些关于如何使用SpringAnnotatedEmbedderRunner实现回滚或使用SpringJUnit4ClassRunner使JBehave工作的文档,但两者都无法工作 是否有人有(最好是简单的)运行带有Spring和Hib

精华:

如何在JUnit测试运行中使用JBehave自动回滚我的休眠事务

问题似乎是JBehave想要
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());
    }
}