55import io .cucumber .core .backend .Glue ;
66import io .cucumber .core .backend .HookDefinition ;
77import io .cucumber .core .backend .ObjectFactory ;
8+ import io .cucumber .core .backend .StaticHookDefinition ;
89import io .cucumber .core .eventbus .EventBus ;
910import io .cucumber .core .feature .TestFeatureParser ;
1011import io .cucumber .core .gherkin .Feature ;
@@ -46,36 +47,36 @@ class RunnerTest {
4647 };
4748
4849 @ Test
49- void hooks_execute_when_world_exist () {
50- final HookDefinition beforeHook = addBeforeHook ();
51- final HookDefinition afterHook = addAfterHook ();
50+ void hooks_execute_inside_world_and_around_world () {
51+ StaticHookDefinition beforeAllHook = createStaticHook ();
52+ StaticHookDefinition afterAllHook = createStaticHook ();
53+ HookDefinition beforeHook = createHook ();
54+ HookDefinition afterHook = createHook ();
5255
5356 Backend backend = mock (Backend .class );
5457 when (backend .getSnippet ()).thenReturn (new TestSnippet ());
5558 ObjectFactory objectFactory = mock (ObjectFactory .class );
5659 doAnswer (invocation -> {
5760 Glue glue = invocation .getArgument (0 );
58- glue .addAfterHook (afterHook );
61+ glue .addBeforeAllHook (beforeAllHook );
62+ glue .addAfterAllHook (afterAllHook );
5963 glue .addBeforeHook (beforeHook );
64+ glue .addAfterHook (afterHook );
6065 return null ;
6166 }).when (backend ).loadGlue (any (Glue .class ), ArgumentMatchers .anyList ());
6267
63- new Runner (bus , singletonList (backend ), objectFactory , typeRegistryConfigurer , runtimeOptions )
64- .runPickle (createPicklesWithSteps ());
68+ Runner runner = new Runner (bus , singletonList (backend ), objectFactory , typeRegistryConfigurer , runtimeOptions );
69+ runner .runBeforeAllHooks ();
70+ runner .runPickle (createPicklesWithSteps ());
71+ runner .runAfterAllHooks ();
6572
66- InOrder inOrder = inOrder (beforeHook , afterHook , backend );
73+ InOrder inOrder = inOrder (beforeAllHook , afterAllHook , beforeHook , afterHook , backend );
74+ inOrder .verify (beforeAllHook ).execute ();
6775 inOrder .verify (backend ).buildWorld ();
6876 inOrder .verify (beforeHook ).execute (any (TestCaseState .class ));
6977 inOrder .verify (afterHook ).execute (any (TestCaseState .class ));
7078 inOrder .verify (backend ).disposeWorld ();
71- }
72-
73- private HookDefinition addBeforeHook () {
74- return addHook ();
75- }
76-
77- private HookDefinition addAfterHook () {
78- return addHook ();
79+ inOrder .verify (afterAllHook ).execute ();
7980 }
8081
8182 private Pickle createPicklesWithSteps () {
@@ -86,7 +87,13 @@ private Pickle createPicklesWithSteps() {
8687 return feature .getPickles ().get (0 );
8788 }
8889
89- private HookDefinition addHook () {
90+ private StaticHookDefinition createStaticHook () {
91+ StaticHookDefinition hook = mock (StaticHookDefinition .class );
92+ when (hook .getLocation ()).thenReturn ("" );
93+ return hook ;
94+ }
95+
96+ private HookDefinition createHook () {
9097 HookDefinition hook = mock (HookDefinition .class );
9198 when (hook .getTagExpression ()).thenReturn ("" );
9299 when (hook .getLocation ()).thenReturn ("" );
@@ -98,7 +105,7 @@ void steps_are_skipped_after_failure() {
98105 StubStepDefinition stepDefinition = spy (new StubStepDefinition ("some step" ));
99106 Pickle pickleMatchingStepDefinitions = createPickleMatchingStepDefinitions (stepDefinition );
100107
101- final HookDefinition failingBeforeHook = addBeforeHook ();
108+ final HookDefinition failingBeforeHook = createHook ();
102109 doThrow (new RuntimeException ("Boom" )).when (failingBeforeHook ).execute (ArgumentMatchers .any ());
103110 TestRunnerSupplier runnerSupplier = new TestRunnerSupplier (bus , runtimeOptions ) {
104111 @ Override
@@ -155,7 +162,7 @@ public void loadGlue(Glue glue, List<URI> gluePaths) {
155162 }
156163
157164 private HookDefinition addAfterStepHook () {
158- return addHook ();
165+ return createHook ();
159166 }
160167
161168 @ Test
@@ -185,10 +192,10 @@ public void loadGlue(Glue glue, List<URI> gluePaths) {
185192
186193 @ Test
187194 void hooks_execute_also_after_failure () {
188- final HookDefinition failingBeforeHook = addBeforeHook ();
195+ final HookDefinition failingBeforeHook = createHook ();
189196 doThrow (new RuntimeException ("boom" )).when (failingBeforeHook ).execute (any (TestCaseState .class ));
190- final HookDefinition beforeHook = addBeforeHook ();
191- final HookDefinition afterHook = addAfterHook ();
197+ final HookDefinition beforeHook = createHook ();
198+ final HookDefinition afterHook = createHook ();
192199
193200 TestRunnerSupplier runnerSupplier = new TestRunnerSupplier (bus , runtimeOptions ) {
194201 @ Override
@@ -241,8 +248,8 @@ public void loadGlue(Glue glue, List<URI> gluePaths) {
241248 void hooks_not_executed_in_dry_run_mode () {
242249 RuntimeOptions runtimeOptions = new RuntimeOptionsBuilder ().setDryRun ().build ();
243250
244- final HookDefinition beforeHook = addBeforeHook ();
245- final HookDefinition afterHook = addAfterHook ();
251+ final HookDefinition beforeHook = createHook ();
252+ final HookDefinition afterHook = createHook ();
246253 final HookDefinition afterStepHook = addAfterStepHook ();
247254
248255 TestRunnerSupplier runnerSupplier = new TestRunnerSupplier (bus , runtimeOptions ) {
@@ -263,8 +270,8 @@ public void loadGlue(Glue glue, List<URI> gluePaths) {
263270
264271 @ Test
265272 void hooks_not_executed_for_empty_pickles () {
266- final HookDefinition beforeHook = addBeforeHook ();
267- final HookDefinition afterHook = addAfterHook ();
273+ final HookDefinition beforeHook = createHook ();
274+ final HookDefinition afterHook = createHook ();
268275 final HookDefinition afterStepHook = addAfterStepHook ();
269276
270277 TestRunnerSupplier runnerSupplier = new TestRunnerSupplier (bus , runtimeOptions ) {
0 commit comments