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);
+ }
+}