cucumber-guice:场景范围的拦截器?

aor9mmx1  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(546)

在cucumber测试中,我想截获系统边界上的一些调用,然后验证这些调用的参数。
因此,在每个场景中,我都会执行一些操作,我的拦截器会截获一些外部系统调用的参数,并将它们存储在某个类中,我们来调用它 ScenarioContext . 然后在@then步骤定义中验证这些参数。
问题是 ScenarioContext 类具有全局 @Singleton 范围意味着许多不好的事情,包括无法并行运行场景、需要在每个场景之后手动清理、场景之间的无意依赖性。
cucumber guice有一个很好的特性叫做 @ScenarioScoped 注解,它允许我有场景范围的类,它就像一个符咒。
我的问题是:有没有可能让我 ScenarioContext 类(由我的拦截器用来存储被截获的内容)是“场景范围”,即在每个场景之后自动清理它等等。?

vybvopom

vybvopom1#

@ScenarioScoped cucumber注入step类的依赖性总是为每个场景重新创建的。您的工作是确保注入的依赖项中没有任何静态字段。静态字段属于类而不是示例,因此不会为每个新示例清除它们。
我写了一篇博文,在这里我和guice分享了两个步骤之间的状态,这是我认为你在问的问题。

dojqjjoe

dojqjjoe2#

是的,这是可能的,只需要正确使用guice喷油器。
guice允许通过提供者混合作用域。因此,解决方案是在我的cucumber级guice模块中添加以下行: bind(ScenarioContext.class).toProvider(ScenarioContextProvider.class).in(CucumberScopes.SCENARIO); /*ScenarioContextProvider - my own basic implementation*/ 然后把这个提供者传递给拦截器。
另一个复杂之处是:在我的例子中,整个应用程序都使用自己的guice注入器,必须在那里创建拦截器。但是 ScenarioContext 住在 cucumber 地里。所以我必须明确地通过 Provider<ScenarioContext> 对象到我的应用程序的guice模块。

相关问题