diff --git a/groovy/pom.xml b/groovy/pom.xml index 1555fd2808..21b8e5a5ef 100644 --- a/groovy/pom.xml +++ b/groovy/pom.xml @@ -52,6 +52,11 @@ cobertura test + + org.mockito + mockito-all + test + diff --git a/groovy/src/main/java/cucumber/runtime/groovy/GroovyBackend.java b/groovy/src/main/java/cucumber/runtime/groovy/GroovyBackend.java index f5953946dc..d993447206 100644 --- a/groovy/src/main/java/cucumber/runtime/groovy/GroovyBackend.java +++ b/groovy/src/main/java/cucumber/runtime/groovy/GroovyBackend.java @@ -37,7 +37,7 @@ public class GroovyBackend implements Backend { private final ClasspathResourceLoader classpathResourceLoader; private Closure worldClosure; - private Object groovyWorld; + private Object world; private Glue glue; private static GroovyShell createShell() { @@ -97,6 +97,7 @@ public void setUnreportedStepExecutor(UnreportedStepExecutor executor) { @Override public void buildWorld() { + world = worldClosure == null ? new Object() : worldClosure.call(); } private Script parse(Resource resource) { @@ -113,7 +114,7 @@ private boolean isScript(Script script) { @Override public void disposeWorld() { - this.groovyWorld = null; + this.world = null; } @Override @@ -126,6 +127,7 @@ public void addStepDefinition(Pattern regexp, int timeoutMillis, Closure body) { } public void registerWorld(Closure closure) { + if (worldClosure != null) throw new CucumberException("World is already set"); worldClosure = closure; } @@ -138,7 +140,7 @@ public void addAfterHook(TagExpression tagExpression, int timeoutMillis, Closure } public void invoke(Closure body, Object[] args) throws Throwable { - body.setDelegate(getGroovyWorld()); + body.setDelegate(world); try { body.call(args); } catch (InvokerInvocationException e) { @@ -146,13 +148,6 @@ public void invoke(Closure body, Object[] args) throws Throwable { } } - private Object getGroovyWorld() { - if (groovyWorld == null) { - groovyWorld = worldClosure == null ? new Object() : worldClosure.call(); - } - return groovyWorld; - } - private static StackTraceElement currentLocation() { Throwable t = new Throwable(); StackTraceElement[] stackTraceElements = t.getStackTrace(); diff --git a/groovy/src/test/java/cucumber/runtime/groovy/GroovyBackendTest.java b/groovy/src/test/java/cucumber/runtime/groovy/GroovyBackendTest.java new file mode 100644 index 0000000000..67a02279cd --- /dev/null +++ b/groovy/src/test/java/cucumber/runtime/groovy/GroovyBackendTest.java @@ -0,0 +1,47 @@ +package cucumber.runtime.groovy; + +import cucumber.runtime.CucumberException; +import cucumber.runtime.io.ResourceLoader; +import groovy.lang.Closure; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import static org.mockito.Mockito.verify; + + +@RunWith(MockitoJUnitRunner.class) +public class GroovyBackendTest { + @Mock + ResourceLoader resourceLoader; + @Mock + Closure closure; + + GroovyBackend backend; + + @Before + public void setUp() throws Exception { + backend = new GroovyBackend(resourceLoader); + } + + @Test + public void builds_world_by_calling_closure() { + backend.registerWorld(closure); + backend.buildWorld(); + + verify(closure).call(); + } + + @Test + public void builds_default_wold_if_wold_closer_does_not_set() { + backend.buildWorld(); + } + + @Test(expected = CucumberException.class) + public void raises_exception_for_two_wolds() { + backend.registerWorld(closure); + backend.registerWorld(closure); + } +}