From 6f6aba0f8de7e8e16eaeeb87fff943bffee0c942 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Fri, 2 May 2014 19:59:50 +0200
Subject: [PATCH 01/15] Disclose that spring step def injection does not work
---
.../runtime/java/spring/AnotherStepDef.java | 20 ++++++++++++++++++
.../runtime/java/spring/OneStepDef.java | 21 +++++++++++++++++++
.../java/spring/stepdefInjection.feature | 6 ++++++
3 files changed, 47 insertions(+)
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
create mode 100644 spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
new file mode 100644
index 0000000000..2435c56fe6
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
@@ -0,0 +1,20 @@
+package cucumber.runtime.java.spring;
+
+import cucumber.api.java.en.Then;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+
+import static org.junit.Assert.assertEquals;
+
+@ContextConfiguration("classpath:cucumber.xml")
+public class AnotherStepDef {
+
+ @Autowired
+ OneStepDef oneStepDef;
+
+ @Then("^I can read (\\d+) cucumbers from the other step def class$")
+ public void i_can_read_cucumbers_from_the_other_step_def_class(int arg1) throws Throwable {
+ assertEquals(arg1, oneStepDef.cucumbers);
+ }
+
+}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
new file mode 100644
index 0000000000..7ff074f31b
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
@@ -0,0 +1,21 @@
+package cucumber.runtime.java.spring;
+
+import cucumber.api.java.en.Given;
+import cucumber.api.java.en.When;
+import org.springframework.test.context.ContextConfiguration;
+
+@ContextConfiguration("classpath:cucumber.xml")
+public class OneStepDef {
+ int cucumbers;
+
+ @Given("^the StepDef injection works$")
+ public void the_StepDef_injection_works() throws Throwable {
+ // blank
+ }
+
+ @When("^I assign the \"cucumbers\" attribute to (\\d+) in one step def class$")
+ public void i_assign_the_cucumbers_attribute_to_in_one_step_def_class(int arg1) throws Throwable {
+ cucumbers = arg1;
+ }
+
+}
diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature b/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature
new file mode 100644
index 0000000000..f5763368e8
--- /dev/null
+++ b/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature
@@ -0,0 +1,6 @@
+Feature: StepDef injection
+
+ Scenario: StepDef injection
+ Given the StepDef injection works
+ When I assign the "cucumbers" attribute to 4 in one step def class
+ Then I can read 4 cucumbers from the other step def class
From 54d04f768a8042bf506760599b874991560613fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Sun, 4 May 2014 15:42:36 +0200
Subject: [PATCH 02/15] Set the cucumber-glue.xml context as parent to the test
context
---
.../runtime/java/spring/SpringFactory.java | 24 +++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index 21cf6b5fd3..8ce4e13d70 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -11,12 +11,12 @@
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestContextManager;
-
import cucumber.runtime.CucumberException;
import cucumber.runtime.java.ObjectFactory;
@@ -150,7 +150,8 @@ private T getTestInstance(final Class type) {
T instance = createTest(type);
if (dependsOnSpringContext(type)) {
- TestContextManager contextManager = new TestContextManager(type);
+ CucumberTestContextManager contextManager = new CucumberTestContextManager(type);
+ contextManager.setParentOnApplicationContext(applicationContext);
contextManager.prepareTestInstance(instance);
contextManager.beforeTestClass();
@@ -173,3 +174,22 @@ private boolean dependsOnSpringContext(Class> type) {
|| type.isAnnotationPresent(ContextHierarchy.class);
}
}
+
+class CucumberTestContextManager extends TestContextManager {
+
+ public CucumberTestContextManager(Class> testClass) {
+ super(testClass);
+ }
+
+ @SuppressWarnings("resource")
+ public void setParentOnApplicationContext(ApplicationContext parentContext) {
+ ConfigurableApplicationContext context =
+ (ConfigurableApplicationContext)getTestContext().getApplicationContext();
+ while (context.getParent() != null && !context.getParent().equals(parentContext)) {
+ context = (ConfigurableApplicationContext)context.getParent();
+ }
+ if (context.getParent() == null) {
+ context.setParent(parentContext);
+ }
+ }
+}
From 8da3bb181bd103b6128b4236f298a06cd90c6f4e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Fri, 9 May 2014 21:16:05 +0200
Subject: [PATCH 03/15] Add transaction test to the spring module
---
.../runtime/java/spring/SpringFactory.java | 13 +++++++
.../PlatformTransactionManagerImpl.java | 29 ++++++++++++++
.../java/spring/TransactionStepDefs.java | 38 +++++++++++++++++++
.../src/test/resources/applicationContext.xml | 2 +
.../runtime/java/spring/transaction.feature | 6 +++
5 files changed, 88 insertions(+)
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring/PlatformTransactionManagerImpl.java
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
create mode 100644 spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index 8ce4e13d70..3062892a17 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -45,6 +45,8 @@ public class SpringFactory implements ObjectFactory {
private final Collection> stepClasses = new HashSet>();
private final Map, TestContextManager> contextManagersByClass = new HashMap, TestContextManager>();
+ private Class> stepClassWithSpringContext = null;
+
public SpringFactory() {
}
@@ -57,6 +59,9 @@ public SpringFactory() {
@Override
public void addClass(final Class> stepClass) {
if (!stepClasses.contains(stepClass)) {
+ if (stepClassWithSpringContext == null && dependsOnSpringContext(stepClass)) {
+ stepClassWithSpringContext = stepClass;
+ }
stepClasses.add(stepClass);
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) applicationContext.getAutowireCapableBeanFactory();
@@ -155,6 +160,14 @@ private T getTestInstance(final Class type) {
contextManager.prepareTestInstance(instance);
contextManager.beforeTestClass();
+ contextManagersByClass.put(type, contextManager);
+ } else if (type.getName().equals("cucumber.api.spring.SpringTransactionHooks") &&
+ stepClassWithSpringContext != null) {
+ CucumberTestContextManager contextManager = new CucumberTestContextManager(stepClassWithSpringContext);
+ contextManager.setParentOnApplicationContext(applicationContext);
+ contextManager.prepareTestInstance(instance);
+ contextManager.beforeTestClass();
+
contextManagersByClass.put(type, contextManager);
}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/PlatformTransactionManagerImpl.java b/spring/src/test/java/cucumber/runtime/java/spring/PlatformTransactionManagerImpl.java
new file mode 100644
index 0000000000..3fe18d94e2
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring/PlatformTransactionManagerImpl.java
@@ -0,0 +1,29 @@
+package cucumber.runtime.java.spring;
+
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionException;
+import org.springframework.transaction.TransactionStatus;
+
+public class PlatformTransactionManagerImpl implements PlatformTransactionManager {
+
+ @SuppressWarnings("serial")
+ @Override
+ public void commit(TransactionStatus arg0) throws TransactionException {
+ throw new TransactionException("commit should not be called") {
+ };
+ }
+
+ @Override
+ public TransactionStatus getTransaction(TransactionDefinition arg0) throws TransactionException {
+ TransactionSynchronizationManager.setActualTransactionActive(true);
+ return null;
+ }
+
+ @Override
+ public void rollback(TransactionStatus arg0) throws TransactionException {
+ TransactionSynchronizationManager.setActualTransactionActive(false);
+ }
+
+}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
new file mode 100644
index 0000000000..a40ff5a7a2
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
@@ -0,0 +1,38 @@
+package cucumber.runtime.java.spring;
+
+import cucumber.api.java.After;
+import cucumber.api.java.Before;
+import cucumber.api.java.en.Given;
+import cucumber.api.java.en.Then;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@ContextConfiguration("classpath:cucumber.xml")
+public class TransactionStepDefs {
+
+ @Given("^a feature with the @txn annotation$")
+ public void a_feature_with_the_txn_annotation() throws Throwable {
+ // blank
+ }
+
+ @Then("^the scenarios shall execute within a transaction$")
+ public void the_scenarios_shall_execute_within_a_transaction() throws Throwable {
+ assertTrue("No transaction is active",
+ TransactionSynchronizationManager.isActualTransactionActive());
+ }
+
+ @Before(value = {"@txn"}, order = 99)
+ public void before_transaction_scenario() {
+ assertFalse("A transaction is active",
+ TransactionSynchronizationManager.isActualTransactionActive());
+ }
+
+ @After(value = {"@txn"}, order = 99)
+ public void after_transaction_scenario() {
+ assertFalse("A transaction is active",
+ TransactionSynchronizationManager.isActualTransactionActive());
+ }
+}
diff --git a/spring/src/test/resources/applicationContext.xml b/spring/src/test/resources/applicationContext.xml
index d0fa560117..8d1e1d92ea 100644
--- a/spring/src/test/resources/applicationContext.xml
+++ b/spring/src/test/resources/applicationContext.xml
@@ -15,4 +15,6 @@
+
+
diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature b/spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature
new file mode 100644
index 0000000000..fc6b1388ff
--- /dev/null
+++ b/spring/src/test/resources/cucumber/runtime/java/spring/transaction.feature
@@ -0,0 +1,6 @@
+@txn
+Feature: Transaction feature
+
+ Scenario: Transaction scenario
+ Given a feature with the @txn annotation
+ Then the scenarios shall execute within a transaction
From 6a5814eca57fa430e601d62e00aeffad43da87ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Sat, 10 May 2014 18:57:37 +0200
Subject: [PATCH 04/15] Make sure dirtyCukes.feature fails if the context is
reused
---
spring/src/test/java/cucumber/runtime/java/spring/Belly.java | 2 +-
.../src/test/java/cucumber/runtime/java/spring/BellyBean.java | 2 +-
.../test/java/cucumber/runtime/java/spring/BellyStepdefs.java | 2 ++
.../runtime/java/spring/DirtiesContextBellyStepDefs.java | 2 ++
4 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/Belly.java b/spring/src/test/java/cucumber/runtime/java/spring/Belly.java
index a772da9055..760c74c6d9 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/Belly.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/Belly.java
@@ -4,7 +4,7 @@
@Component
public class Belly {
- private int cukes;
+ private int cukes = 0;
public void setCukes(int cukes) {
this.cukes = cukes;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/BellyBean.java b/spring/src/test/java/cucumber/runtime/java/spring/BellyBean.java
index 78ff2371e3..b998b362c9 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/BellyBean.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/BellyBean.java
@@ -3,7 +3,7 @@
public class BellyBean {
- private int cukes;
+ private int cukes = 0;
public void setCukes(int cukes) {
this.cukes = cukes;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/BellyStepdefs.java b/spring/src/test/java/cucumber/runtime/java/spring/BellyStepdefs.java
index 375ea0edc1..d0fc0cc99f 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/BellyStepdefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/BellyStepdefs.java
@@ -19,6 +19,7 @@ public class BellyStepdefs {
@Then("^there are (\\d+) cukes in my belly")
public void checkCukes(final int n) {
assertEquals(n, belly.getCukes());
+ belly.setCukes(0);
}
@Given("^I have (\\d+) cukes in my belly")
@@ -34,6 +35,7 @@ public void I_have_beans_in_my_belly(int n) {
@Then("^there are (\\d+) beans in my belly$")
public void there_are_beans_in_my_belly(int n) {
assertEquals(n, bellyBean.getCukes());
+ bellyBean.setCukes(0);
}
public BellyBean getBellyBean() {
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/DirtiesContextBellyStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring/DirtiesContextBellyStepDefs.java
index 14128081cb..fb2bc7efb1 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/DirtiesContextBellyStepDefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/DirtiesContextBellyStepDefs.java
@@ -26,11 +26,13 @@ public void checkCukes(final int n) {
@Given("^I have (\\d+) dirty cukes in my belly")
public void haveCukes(final int n) {
+ assertEquals(0, belly.getCukes());
belly.setCukes(n);
}
@Given("^I have (\\d+) dirty beans in my belly$")
public void I_have_beans_in_my_belly(int n) {
+ assertEquals(0, bellyBean.getCukes());
bellyBean.setCukes(n);
}
From 13640b28defde786572fc1ec63a7eed06f53c629 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Sun, 11 May 2014 10:40:37 +0200
Subject: [PATCH 05/15] Use the same class to create all TestContextManagers
Use the first class found with spring annotation, to create the
TestContextManagers for all glue classes.
---
.../runtime/java/spring/SpringFactory.java | 10 +---------
.../runtime/java/spring/AnotherStepDef.java | 2 --
.../runtime/java/spring/OneStepDef.java | 2 --
.../runtime/java/spring/RunCukesTest.java | 8 --------
.../runtime/java/spring/SpringFactoryTest.java | 9 +++++++--
.../java/spring/TransactionStepDefs.java | 2 --
.../BellyStepdefs.java | 5 +++--
.../java/spring_contextconfig/RunCukesTest.java | 17 +++++++++++++++++
.../WithSpringAnnotations.java | 4 +++-
.../WithContextHierarchyAnnotation.java | 4 ++--
.../DirtiesContextBellyStepDefs.java | 9 +++++----
.../RunCukesTest.java | 12 ++++++++++++
.../java/spring_webappconfig/RunCukesTest.java | 12 ++++++++++++
.../SpringInjectionStepDefs.java | 2 +-
14 files changed, 63 insertions(+), 35 deletions(-)
delete mode 100644 spring/src/test/java/cucumber/runtime/java/spring/RunCukesTest.java
rename spring/src/test/java/cucumber/runtime/java/{spring => spring_contextconfig}/BellyStepdefs.java (88%)
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring_contextconfig/RunCukesTest.java
rename spring/src/test/java/cucumber/runtime/java/{spring => spring_contextconfig}/WithSpringAnnotations.java (85%)
rename spring/src/test/java/cucumber/runtime/java/{spring => spring_contexthierarchyconfig}/WithContextHierarchyAnnotation.java (82%)
rename spring/src/test/java/cucumber/runtime/java/{spring => spring_dirtiescontextconfig}/DirtiesContextBellyStepDefs.java (89%)
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring_webappconfig/RunCukesTest.java
rename spring/src/test/java/cucumber/runtime/java/{spring => spring_webappconfig}/SpringInjectionStepDefs.java (96%)
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index 3062892a17..6f2b0992e0 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -154,15 +154,7 @@ private T getTestInstance(final Class type) {
try {
T instance = createTest(type);
- if (dependsOnSpringContext(type)) {
- CucumberTestContextManager contextManager = new CucumberTestContextManager(type);
- contextManager.setParentOnApplicationContext(applicationContext);
- contextManager.prepareTestInstance(instance);
- contextManager.beforeTestClass();
-
- contextManagersByClass.put(type, contextManager);
- } else if (type.getName().equals("cucumber.api.spring.SpringTransactionHooks") &&
- stepClassWithSpringContext != null) {
+ if (stepClassWithSpringContext != null) {
CucumberTestContextManager contextManager = new CucumberTestContextManager(stepClassWithSpringContext);
contextManager.setParentOnApplicationContext(applicationContext);
contextManager.prepareTestInstance(instance);
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
index 2435c56fe6..d71a9c3498 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
@@ -2,11 +2,9 @@
import cucumber.api.java.en.Then;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
import static org.junit.Assert.assertEquals;
-@ContextConfiguration("classpath:cucumber.xml")
public class AnotherStepDef {
@Autowired
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
index 7ff074f31b..0102a2fd1c 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
@@ -2,9 +2,7 @@
import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
-import org.springframework.test.context.ContextConfiguration;
-@ContextConfiguration("classpath:cucumber.xml")
public class OneStepDef {
int cucumbers;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/RunCukesTest.java
deleted file mode 100644
index 3171c8e3d2..0000000000
--- a/spring/src/test/java/cucumber/runtime/java/spring/RunCukesTest.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package cucumber.runtime.java.spring;
-
-import cucumber.api.junit.Cucumber;
-import org.junit.runner.RunWith;
-
-@RunWith(Cucumber.class)
-public class RunCukesTest {
-}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
index 0dedd7f344..3ae13b2d69 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
@@ -1,8 +1,11 @@
package cucumber.runtime.java.spring;
-import org.junit.Test;
-
import cucumber.runtime.java.ObjectFactory;
+import cucumber.runtime.java.spring_contextconfig.BellyStepdefs;
+import cucumber.runtime.java.spring_contextconfig.WithSpringAnnotations;
+import cucumber.runtime.java.spring_contexthierarchyconfig.WithContextHierarchyAnnotation;
+import cucumber.runtime.java.spring_dirtiescontextconfig.DirtiesContextBellyStepDefs;
+import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -36,12 +39,14 @@ public void shouldGiveUsNewStepInstancesForEachScenario() {
public void shouldNeverCreateNewApplicationBeanInstances() {
// Feature 1
final ObjectFactory factory1 = new SpringFactory();
+ factory1.addClass(BellyStepdefs.class);
factory1.start();
final BellyBean o1 = factory1.getInstance(BellyStepdefs.class).getBellyBean();
factory1.stop();
// Feature 2
final ObjectFactory factory2 = new SpringFactory();
+ factory2.addClass(BellyStepdefs.class);
factory2.start();
final BellyBean o2 = factory2.getInstance(BellyStepdefs.class).getBellyBean();
factory2.stop();
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
index a40ff5a7a2..417fb62c79 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
@@ -4,13 +4,11 @@
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
-import org.springframework.test.context.ContextConfiguration;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-@ContextConfiguration("classpath:cucumber.xml")
public class TransactionStepDefs {
@Given("^a feature with the @txn annotation$")
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/BellyStepdefs.java b/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/BellyStepdefs.java
similarity index 88%
rename from spring/src/test/java/cucumber/runtime/java/spring/BellyStepdefs.java
rename to spring/src/test/java/cucumber/runtime/java/spring_contextconfig/BellyStepdefs.java
index d0fc0cc99f..a24955aeda 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/BellyStepdefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/BellyStepdefs.java
@@ -1,7 +1,9 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring_contextconfig;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
+import cucumber.runtime.java.spring.Belly;
+import cucumber.runtime.java.spring.BellyBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
@@ -35,7 +37,6 @@ public void I_have_beans_in_my_belly(int n) {
@Then("^there are (\\d+) beans in my belly$")
public void there_are_beans_in_my_belly(int n) {
assertEquals(n, bellyBean.getCukes());
- bellyBean.setCukes(0);
}
public BellyBean getBellyBean() {
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/RunCukesTest.java
new file mode 100644
index 0000000000..724ebe651a
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/RunCukesTest.java
@@ -0,0 +1,17 @@
+package cucumber.runtime.java.spring_contextconfig;
+
+import cucumber.api.CucumberOptions;
+
+import cucumber.api.junit.Cucumber;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(glue = {"cucumber.runtime.java.spring_contextconfig",
+ "cucumber.runtime.java.spring",
+ "cucumber.api.spring"},
+ features = {"classpath:cucumber/runtime/java/spring/cukes.feature",
+ "classpath:cucumber/runtime/java/spring/xmlBasedSpring.feature",
+ "classpath:cucumber/runtime/java/spring/stepdefInjection.feature",
+ "classpath:cucumber/runtime/java/spring/transaction.feature"})
+public class RunCukesTest {
+}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/WithSpringAnnotations.java b/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/WithSpringAnnotations.java
similarity index 85%
rename from spring/src/test/java/cucumber/runtime/java/spring/WithSpringAnnotations.java
rename to spring/src/test/java/cucumber/runtime/java/spring_contextconfig/WithSpringAnnotations.java
index d783f07f6a..99e62ff4c6 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/WithSpringAnnotations.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/WithSpringAnnotations.java
@@ -1,5 +1,6 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring_contextconfig;
+import cucumber.runtime.java.spring.DummyComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.ContextConfiguration;
@@ -24,4 +25,5 @@ public boolean isAutowired() {
public String getProperty() {
return property;
}
+
}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/WithContextHierarchyAnnotation.java b/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
similarity index 82%
rename from spring/src/test/java/cucumber/runtime/java/spring/WithContextHierarchyAnnotation.java
rename to spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
index da63ae172f..f6698c7ff6 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/WithContextHierarchyAnnotation.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
@@ -1,7 +1,7 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring_contexthierarchyconfig;
+import cucumber.runtime.java.spring.DummyComponent;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/DirtiesContextBellyStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/DirtiesContextBellyStepDefs.java
similarity index 89%
rename from spring/src/test/java/cucumber/runtime/java/spring/DirtiesContextBellyStepDefs.java
rename to spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/DirtiesContextBellyStepDefs.java
index fb2bc7efb1..6c2527d2a6 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/DirtiesContextBellyStepDefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/DirtiesContextBellyStepDefs.java
@@ -1,12 +1,13 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring_dirtiescontextconfig;
+import cucumber.api.java.en.Given;
+import cucumber.api.java.en.Then;
+import cucumber.runtime.java.spring.Belly;
+import cucumber.runtime.java.spring.BellyBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
-import cucumber.api.java.en.Given;
-import cucumber.api.java.en.Then;
-
import static org.junit.Assert.assertEquals;
@ContextConfiguration("classpath:cucumber.xml")
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
new file mode 100644
index 0000000000..121757eb94
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
@@ -0,0 +1,12 @@
+package cucumber.runtime.java.spring_dirtiescontextconfig;
+
+import cucumber.api.CucumberOptions;
+
+import cucumber.api.junit.Cucumber;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(glue = {"cucumber.runtime.java.spring_dirtiescontextconfig", "cucumber.runtime.java.spring"},
+ features = {"classpath:cucumber/runtime/java/spring/dirtyCukes.feature"})
+public class RunCukesTest {
+}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/RunCukesTest.java
new file mode 100644
index 0000000000..bf5c9702bd
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/RunCukesTest.java
@@ -0,0 +1,12 @@
+package cucumber.runtime.java.spring_webappconfig;
+
+import cucumber.api.CucumberOptions;
+
+import cucumber.api.junit.Cucumber;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(glue = {"cucumber.runtime.java.spring_webappconfig"},
+ features = {"classpath:cucumber/runtime/java/spring/springinjection.feature"})
+public class RunCukesTest {
+}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringInjectionStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/SpringInjectionStepDefs.java
similarity index 96%
rename from spring/src/test/java/cucumber/runtime/java/spring/SpringInjectionStepDefs.java
rename to spring/src/test/java/cucumber/runtime/java/spring_webappconfig/SpringInjectionStepDefs.java
index 9ef52e803f..0005f0254b 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/SpringInjectionStepDefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/SpringInjectionStepDefs.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring_webappconfig;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
From 61c9d5845c7d08f0f11283ec6e22f64fbc33bd0c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Tue, 13 May 2014 20:30:43 +0200
Subject: [PATCH 06/15] Fail if no glue class with spring annotation is found
---
.../cucumber/runtime/java/spring/SpringFactory.java | 3 +++
.../runtime/java/spring/SpringFactoryTest.java | 10 +++++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index 6f2b0992e0..b9e8fcad1d 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -75,6 +75,9 @@ public void addClass(final Class> stepClass) {
@Override
public void start() {
+ if (stepClassWithSpringContext == null) {
+ throw new CucumberException("No glue class with spring annotation found");
+ }
GlueCodeContext.INSTANCE.start();
}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
index 3ae13b2d69..918b7da837 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
@@ -1,5 +1,6 @@
package cucumber.runtime.java.spring;
+import cucumber.runtime.CucumberException;
import cucumber.runtime.java.ObjectFactory;
import cucumber.runtime.java.spring_contextconfig.BellyStepdefs;
import cucumber.runtime.java.spring_contextconfig.WithSpringAnnotations;
@@ -104,7 +105,7 @@ public void shouldRespectDirtiesContextAnnotationsInStepDefs() {
@Test
public void shouldNotFailOnNonSpringStepDefs() {
final ObjectFactory factory = new SpringFactory();
- factory.addClass(UnusedGlue.class);
+ factory.addClass(WithSpringAnnotations.class);
factory.start();
NonSpringGlue stepdef = factory.getInstance(NonSpringGlue.class);
factory.stop();
@@ -122,4 +123,11 @@ public void shouldRespectCustomPropertyPlaceholderConfigurer() {
assertEquals("property value", stepdef.getProperty());
}
+
+ @Test(expected=CucumberException.class)
+ public void shouldFailIfNoGlueClassWithSpringAnnotationIsFound() {
+ final ObjectFactory factory = new SpringFactory();
+ factory.addClass(UnusedGlue.class);
+ factory.start();
+ }
}
From 73039ae516c6e2253ef91b0deb834486cb769441 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Tue, 13 May 2014 20:31:00 +0200
Subject: [PATCH 07/15] Fail if glue classes with different spring annotations
are found
---
.../runtime/java/spring/SpringFactory.java | 35 +++++++++++++++++--
.../java/spring/SpringFactoryTest.java | 15 ++++++++
...thDifferentContextHierarchyAnnotation.java | 22 ++++++++++++
3 files changed, 70 insertions(+), 2 deletions(-)
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index b9e8fcad1d..6ba27c3e56 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -2,6 +2,7 @@
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -59,8 +60,12 @@ public SpringFactory() {
@Override
public void addClass(final Class> stepClass) {
if (!stepClasses.contains(stepClass)) {
- if (stepClassWithSpringContext == null && dependsOnSpringContext(stepClass)) {
- stepClassWithSpringContext = stepClass;
+ if (dependsOnSpringContext(stepClass)) {
+ if (stepClassWithSpringContext == null) {
+ stepClassWithSpringContext = stepClass;
+ } else {
+ checkAnnotationsEqual(stepClassWithSpringContext, stepClass);
+ }
}
stepClasses.add(stepClass);
@@ -73,6 +78,32 @@ public void addClass(final Class> stepClass) {
}
}
+ private void checkAnnotationsEqual(Class> stepClassWithSpringContext, Class> stepClass) {
+ Annotation[] annotations1 = stepClassWithSpringContext.getAnnotations();
+ Annotation[] annotations2 = stepClass.getAnnotations();
+ if (annotations1.length != annotations2.length) {
+ throw new CucumberException("Annotations differs on glue classes found: " +
+ stepClassWithSpringContext.getName() + ", " +
+ stepClass.getName());
+ }
+ for (Annotation annotation : annotations1) {
+ if (!isAnnotationInArray(annotation, annotations2)) {
+ throw new CucumberException("Annotations differs on glue classes found: " +
+ stepClassWithSpringContext.getName() + ", " +
+ stepClass.getName());
+ }
+ }
+ }
+
+ private boolean isAnnotationInArray(Annotation annotation, Annotation[] annotations) {
+ for (Annotation annotationFromArray: annotations) {
+ if (annotation.equals(annotationFromArray)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@Override
public void start() {
if (stepClassWithSpringContext == null) {
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
index 918b7da837..c042b6e0c8 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
@@ -5,6 +5,7 @@
import cucumber.runtime.java.spring_contextconfig.BellyStepdefs;
import cucumber.runtime.java.spring_contextconfig.WithSpringAnnotations;
import cucumber.runtime.java.spring_contexthierarchyconfig.WithContextHierarchyAnnotation;
+import cucumber.runtime.java.spring_contexthierarchyconfig.WithDifferentContextHierarchyAnnotation;
import cucumber.runtime.java.spring_dirtiescontextconfig.DirtiesContextBellyStepDefs;
import org.junit.Test;
@@ -130,4 +131,18 @@ public void shouldFailIfNoGlueClassWithSpringAnnotationIsFound() {
factory.addClass(UnusedGlue.class);
factory.start();
}
+
+ @Test
+ public void shouldAllowClassesWithSameSpringAnnotations() {
+ final ObjectFactory factory = new SpringFactory();
+ factory.addClass(WithSpringAnnotations.class);
+ factory.addClass(BellyStepdefs.class);
+ }
+
+ @Test(expected=CucumberException.class)
+ public void shouldFailIfClassesWithDifferentSpringAnnotationsAreFound() {
+ final ObjectFactory factory = new SpringFactory();
+ factory.addClass(WithContextHierarchyAnnotation.class);
+ factory.addClass(WithDifferentContextHierarchyAnnotation.class);
+ }
}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java b/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
new file mode 100644
index 0000000000..a6cce743e6
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
@@ -0,0 +1,22 @@
+package cucumber.runtime.java.spring_contexthierarchyconfig;
+
+import cucumber.runtime.java.spring.DummyComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
+
+@ContextHierarchy(@ContextConfiguration("classpath:cucumber2.xml"))
+public class WithDifferentContextHierarchyAnnotation {
+
+ private boolean autowired;
+
+ @Autowired
+ public void setAutowiredCollaborator(DummyComponent collaborator) {
+ autowired = true;
+ }
+
+ public boolean isAutowired() {
+ return autowired;
+ }
+
+}
From e53331eafbe64b0bd927ac13b7163f79580065a6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Tue, 13 May 2014 20:31:08 +0200
Subject: [PATCH 08/15] Only create one spring TestContextManager
---
.../runtime/java/spring/SpringFactory.java | 75 ++++---------------
1 file changed, 14 insertions(+), 61 deletions(-)
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index 6ba27c3e56..86f4a64aa8 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -1,12 +1,8 @@
package cucumber.runtime.java.spring;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.lang.annotation.Annotation;
import java.util.Collection;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Map;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@@ -44,7 +40,7 @@ public class SpringFactory implements ObjectFactory {
private static ConfigurableListableBeanFactory beanFactory;
private final Collection> stepClasses = new HashSet>();
- private final Map, TestContextManager> contextManagersByClass = new HashMap, TestContextManager>();
+ private CucumberTestContextManager testContextManager;
private Class> stepClassWithSpringContext = null;
@@ -114,65 +110,20 @@ public void start() {
@Override
public void stop() {
- notifyContextManagersAboutTestClassFinished();
+ notifyContextManagerAboutTestClassFinished();
GlueCodeContext.INSTANCE.stop();
beanFactory.destroySingletons();
}
- private void notifyContextManagersAboutTestClassFinished() {
- Map, Exception> exceptionsThrown = new HashMap, Exception>();
-
- for (Map.Entry, TestContextManager> classTestContextManagerEntry : contextManagersByClass
- .entrySet()) {
+ private void notifyContextManagerAboutTestClassFinished() {
+ if (testContextManager != null) {
try {
- classTestContextManagerEntry.getValue().afterTestClass();
+ testContextManager.afterTestClass();
} catch (Exception e) {
- exceptionsThrown.put(classTestContextManagerEntry.getKey(), e);
+ throw new CucumberException(e.getMessage(), e);
}
}
-
- contextManagersByClass.clear();
-
- rethrowExceptionsIfAny(exceptionsThrown);
- }
-
- private void rethrowExceptionsIfAny(Map, Exception> exceptionsThrown) {
- if (exceptionsThrown.isEmpty()) {
- return;
- }
-
- if (exceptionsThrown.size() == 1) {
- //ony one exception, throw an exception with the correct cause
- Exception e = exceptionsThrown.values().iterator().next();
- throw new CucumberException(e.getMessage(), e);
- }
-
- //multiple exceptions but we can only have one cause, put relevant info in the exception message
- //to not lose the interesting data
- throw new CucumberException(getMultipleExceptionMessage(exceptionsThrown));
- }
-
- private String getMultipleExceptionMessage(Map, Exception> exceptionsThrow) {
- StringBuilder exceptionsThrown = new StringBuilder(1000);
- exceptionsThrown.append("Multiple exceptions occurred during processing of the TestExecutionListeners\n\n");
-
- for (Map.Entry, Exception> classExceptionEntry : exceptionsThrow.entrySet()) {
- exceptionsThrown.append("Exception during processing of TestExecutionListeners of ");
- exceptionsThrown.append(classExceptionEntry.getKey());
- exceptionsThrown.append('\n');
- exceptionsThrown.append(classExceptionEntry.getValue().toString());
- exceptionsThrown.append('\n');
-
- StringWriter stackTraceStringWriter = new StringWriter();
- PrintWriter stackTracePrintWriter = new PrintWriter(stackTraceStringWriter);
- classExceptionEntry.getValue().printStackTrace(stackTracePrintWriter);
- exceptionsThrown.append(stackTraceStringWriter.toString());
- exceptionsThrown.append('\n');
-
- }
-
- return exceptionsThrown.toString();
}
@Override
@@ -189,12 +140,14 @@ private T getTestInstance(final Class type) {
T instance = createTest(type);
if (stepClassWithSpringContext != null) {
- CucumberTestContextManager contextManager = new CucumberTestContextManager(stepClassWithSpringContext);
- contextManager.setParentOnApplicationContext(applicationContext);
- contextManager.prepareTestInstance(instance);
- contextManager.beforeTestClass();
-
- contextManagersByClass.put(type, contextManager);
+ if (testContextManager == null) {
+ testContextManager = new CucumberTestContextManager(stepClassWithSpringContext);
+ testContextManager.setParentOnApplicationContext(applicationContext);
+ testContextManager.prepareTestInstance(instance);
+ testContextManager.beforeTestClass();
+ } else {
+ testContextManager.prepareTestInstance(instance);
+ }
}
return instance;
From 17aef314f866359b3398fb92a44842da51d4e6ce Mon Sep 17 00:00:00 2001
From: Miguel Almeida
Date: Tue, 26 Nov 2013 16:44:07 +0000
Subject: [PATCH 09/15] Updated RunCukesTest in the example spring-txn with new
hook location.
---
.../test/java/cucumber/examples/spring/txn/RunCukesTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java b/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java
index 8d3fa8c5d5..81226bd46e 100644
--- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java
+++ b/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/RunCukesTest.java
@@ -5,6 +5,6 @@
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
-@CucumberOptions(glue = {"cucumber.examples.spring.txn", "cucumber.runtime.java.spring.hooks"})
+@CucumberOptions(glue = {"cucumber.examples.spring.txn", "cucumber.api.spring"})
public class RunCukesTest {
}
From ebf0da7d7f40cb6aba0af2443c374f8c41e3f7a8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Thu, 1 May 2014 10:36:30 +0200
Subject: [PATCH 10/15] Make example/spring-txn fail if transactions are not
used
Also remove the @txn annotation from see_message.feature, since it
fails if transactions are used.
---
.../test/java/cucumber/examples/spring/txn/UserStepdefs.java | 5 +++++
.../cucumber/examples/spring/txn/see_messages.feature | 1 -
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java b/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java
index 7f2a6ba9c1..e4119aa730 100644
--- a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java
+++ b/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/UserStepdefs.java
@@ -4,6 +4,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import static org.junit.Assert.assertTrue;
import java.util.List;
@@ -31,5 +34,7 @@ public void a_User_has_posted_the_following_messages(List messages) thr
m.setAuthor(user);
messageRepository.save(m);
}
+ assertTrue("No transaction is active",
+ TransactionSynchronizationManager.isActualTransactionActive());
}
}
diff --git a/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature b/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature
index 0c1113fe52..4b4db93cd2 100644
--- a/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature
+++ b/examples/spring-txn/src/test/resources/cucumber/examples/spring/txn/see_messages.feature
@@ -1,4 +1,3 @@
-@txn
Feature: See Messages
Scenario: See another user's messages
From 8ac8f435f2472945a9542b0a229c9f219a65e6bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Tue, 13 May 2014 20:31:21 +0200
Subject: [PATCH 11/15] Test step def injection in the oposite direction.
Test that if a step def class autowires another step def class that has
not been used yet. Then it is the instance that was autowired that are
returned to the backend, when asked for an instance.
---
.../cucumber/runtime/java/spring/OneStepDef.java | 6 ++++++
.../runtime/java/spring/ThirdStepDef.java | 15 +++++++++++++++
.../runtime/java/spring/stepdefInjection.feature | 1 +
3 files changed, 22 insertions(+)
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring/ThirdStepDef.java
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
index 0102a2fd1c..6e6cd3fa75 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
@@ -1,11 +1,16 @@
package cucumber.runtime.java.spring;
+import org.springframework.beans.factory.annotation.Autowired;
+
import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
public class OneStepDef {
int cucumbers;
+ @Autowired
+ ThirdStepDef thirdStepDef;
+
@Given("^the StepDef injection works$")
public void the_StepDef_injection_works() throws Throwable {
// blank
@@ -14,6 +19,7 @@ public void the_StepDef_injection_works() throws Throwable {
@When("^I assign the \"cucumbers\" attribute to (\\d+) in one step def class$")
public void i_assign_the_cucumbers_attribute_to_in_one_step_def_class(int arg1) throws Throwable {
cucumbers = arg1;
+ thirdStepDef.cucumbers = arg1;
}
}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/ThirdStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/ThirdStepDef.java
new file mode 100644
index 0000000000..6430e1b38f
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring/ThirdStepDef.java
@@ -0,0 +1,15 @@
+package cucumber.runtime.java.spring;
+
+import cucumber.api.java.en.Then;
+
+import static org.junit.Assert.assertEquals;
+
+public class ThirdStepDef {
+ int cucumbers;
+
+ @Then("^(\\d+) have been pushed to a third step def class$")
+ public void have_been_pushed_to_a_third_step_def_class(int arg1) throws Throwable {
+ assertEquals(arg1, cucumbers);
+ }
+
+}
diff --git a/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature b/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature
index f5763368e8..43538c5624 100644
--- a/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature
+++ b/spring/src/test/resources/cucumber/runtime/java/spring/stepdefInjection.feature
@@ -4,3 +4,4 @@ Feature: StepDef injection
Given the StepDef injection works
When I assign the "cucumbers" attribute to 4 in one step def class
Then I can read 4 cucumbers from the other step def class
+ And 4 have been pushed to a third step def class
From f895b9ea780f6f49a85f5e0b958e53e0b8cad2e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Sun, 18 May 2014 10:56:22 +0200
Subject: [PATCH 12/15] Register the glue classes in the TestContextManager's
context
Let the SpringFactory register the bean definitions of the glue classes
in the bean factory of TestContextManager's context. Use this bean
factoryto create the instances of the glue classes. Alse register the
GlueCodeScope in bean factory of the TestContextManager's context.
---
.../runtime/java/spring/SpringFactory.java | 147 +++++++++---------
.../runtime/java/spring/cucumber-glue.xml | 18 ---
.../AutowiresPlatformTransactionManager.java | 15 ++
.../java/spring/AutowiresThirdStepDef.java | 14 ++
.../runtime/java/spring/NonSpringGlue.java | 17 --
.../runtime/java/spring/OneStepDef.java | 6 +-
.../java/spring/SpringFactoryTest.java | 69 ++++++--
.../WithContextHierarchyAnnotation.java | 5 +-
.../RunCukesTest.java | 2 +-
.../src/test/resources/applicationContext.xml | 2 +-
spring/src/test/resources/cucumber2.xml | 9 ++
11 files changed, 181 insertions(+), 123 deletions(-)
delete mode 100644 spring/src/main/resources/cucumber/runtime/java/spring/cucumber-glue.xml
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring/AutowiresPlatformTransactionManager.java
create mode 100644 spring/src/test/java/cucumber/runtime/java/spring/AutowiresThirdStepDef.java
delete mode 100644 spring/src/test/java/cucumber/runtime/java/spring/NonSpringGlue.java
create mode 100644 spring/src/test/resources/cucumber2.xml
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index 86f4a64aa8..b0c6f63a8d 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -1,31 +1,37 @@
package cucumber.runtime.java.spring;
-import java.lang.annotation.Annotation;
-import java.util.Collection;
-import java.util.HashSet;
-
+import cucumber.runtime.CucumberException;
+import cucumber.runtime.java.ObjectFactory;
+import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
-import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.TestContextManager;
-import cucumber.runtime.CucumberException;
-import cucumber.runtime.java.ObjectFactory;
+
+import java.lang.annotation.Annotation;
+import java.util.Collection;
+import java.util.HashSet;
/**
* Spring based implementation of ObjectFactory.
*
*
*
- * - It uses TestContextManager to create and prepare test instances. Configuration via: @ContextConfiguration
+ *
- It uses TestContextManager to create and prepare test instances.
+ * Configuration via: @ContextConfiguration of @ContextHierarcy
+ * At least on step definition class needs to have a @ContextConfiguration or
+ * @ContextHierarchy annotation. If more that one step definition class has such
+ * an annotation, the annotations must be equal on the different step definition
+ * classes.
+ * - The step definitions class with @ContextConfiguration or @ContextHierarchy
+ * annotation, may also have a @WebAppConfiguration or @DirtiesContext annotation.
*
- * - It also uses a context which contains the step definitions and is reloaded for each
- * scenario.
+ * - The step definitions added to the TestContextManagers context and
+ * is reloaded for each scenario.
*
*
*
@@ -36,23 +42,15 @@
*/
public class SpringFactory implements ObjectFactory {
- private static ConfigurableApplicationContext applicationContext;
- private static ConfigurableListableBeanFactory beanFactory;
-
- private final Collection> stepClasses = new HashSet>();
+ private ConfigurableListableBeanFactory beanFactory;
private CucumberTestContextManager testContextManager;
+ private final Collection> stepClasses = new HashSet>();
private Class> stepClassWithSpringContext = null;
public SpringFactory() {
}
- static {
- applicationContext = new GenericXmlApplicationContext("cucumber/runtime/java/spring/cucumber-glue.xml");
- applicationContext.registerShutdownHook();
- beanFactory = applicationContext.getBeanFactory();
- }
-
@Override
public void addClass(final Class> stepClass) {
if (!stepClasses.contains(stepClass)) {
@@ -65,12 +63,6 @@ public void addClass(final Class> stepClass) {
}
stepClasses.add(stepClass);
- BeanDefinitionRegistry registry = (BeanDefinitionRegistry) applicationContext.getAutowireCapableBeanFactory();
- BeanDefinition beanDefinition = BeanDefinitionBuilder
- .genericBeanDefinition(stepClass)
- .setScope(GlueCodeScope.NAME)
- .getBeanDefinition();
- registry.registerBeanDefinition(stepClass.getName(), beanDefinition);
}
}
@@ -103,64 +95,69 @@ private boolean isAnnotationInArray(Annotation annotation, Annotation[] annotati
@Override
public void start() {
if (stepClassWithSpringContext == null) {
- throw new CucumberException("No glue class with spring annotation found");
+ throw new CucumberException("No glue class with spring annotation found. " +
+ "One glue class with @ContextConfiguration or " +
+ "@ContextHierarcy annotation is needed.");
+ }
+ testContextManager = new CucumberTestContextManager(stepClassWithSpringContext);
+ notifyContextManagerAboutTestClassStarted();
+ if (isFirstScenario() || isNewContextCreated()) {
+ beanFactory = testContextManager.getBeanFactory();
+ for (Class> stepClass : stepClasses) {
+ registerStepClassBeanDefinition(stepClass);
+ }
}
GlueCodeContext.INSTANCE.start();
}
+ private void notifyContextManagerAboutTestClassStarted() {
+ try {
+ testContextManager.beforeTestClass();
+ } catch (Exception e) {
+ throw new CucumberException(e.getMessage(), e);
+ }
+ }
+
+ private boolean isFirstScenario() {
+ return beanFactory == null;
+ }
+
+ private boolean isNewContextCreated() {
+ return !beanFactory.equals(testContextManager.getBeanFactory());
+ }
+
+ private void registerStepClassBeanDefinition(Class> stepClass) {
+ BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
+ BeanDefinition beanDefinition = BeanDefinitionBuilder
+ .genericBeanDefinition(stepClass)
+ .setScope(GlueCodeScope.NAME)
+ .getBeanDefinition();
+ registry.registerBeanDefinition(stepClass.getName(), beanDefinition);
+ }
+
@Override
public void stop() {
notifyContextManagerAboutTestClassFinished();
-
GlueCodeContext.INSTANCE.stop();
- beanFactory.destroySingletons();
}
private void notifyContextManagerAboutTestClassFinished() {
- if (testContextManager != null) {
- try {
- testContextManager.afterTestClass();
- } catch (Exception e) {
- throw new CucumberException(e.getMessage(), e);
- }
+ try {
+ testContextManager.afterTestClass();
+ } catch (Exception e) {
+ throw new CucumberException(e.getMessage(), e);
}
}
@Override
public T getInstance(final Class type) {
- if (!beanFactory.containsSingleton(type.getName())) {
- beanFactory.registerSingleton(type.getName(), getTestInstance(type));
- }
-
- return applicationContext.getBean(type);
- }
-
- private T getTestInstance(final Class type) {
try {
- T instance = createTest(type);
-
- if (stepClassWithSpringContext != null) {
- if (testContextManager == null) {
- testContextManager = new CucumberTestContextManager(stepClassWithSpringContext);
- testContextManager.setParentOnApplicationContext(applicationContext);
- testContextManager.prepareTestInstance(instance);
- testContextManager.beforeTestClass();
- } else {
- testContextManager.prepareTestInstance(instance);
- }
- }
-
- return instance;
- } catch (Exception e) {
+ return beanFactory.getBean(type);
+ } catch (BeansException e) {
throw new CucumberException(e.getMessage(), e);
}
}
- @SuppressWarnings("unchecked")
- protected T createTest(Class type) throws Exception {
- return (T) type.getConstructors()[0].newInstance();
- }
-
private boolean dependsOnSpringContext(Class> type) {
return type.isAnnotationPresent(ContextConfiguration.class)
|| type.isAnnotationPresent(ContextHierarchy.class);
@@ -171,17 +168,21 @@ class CucumberTestContextManager extends TestContextManager {
public CucumberTestContextManager(Class> testClass) {
super(testClass);
+ registerGlueCodeScope(getContext());
}
- @SuppressWarnings("resource")
- public void setParentOnApplicationContext(ApplicationContext parentContext) {
- ConfigurableApplicationContext context =
- (ConfigurableApplicationContext)getTestContext().getApplicationContext();
- while (context.getParent() != null && !context.getParent().equals(parentContext)) {
+ public ConfigurableListableBeanFactory getBeanFactory() {
+ return getContext().getBeanFactory();
+ }
+
+ private ConfigurableApplicationContext getContext() {
+ return (ConfigurableApplicationContext)getTestContext().getApplicationContext();
+ }
+
+ private void registerGlueCodeScope(ConfigurableApplicationContext context) {
+ do {
+ context.getBeanFactory().registerScope(GlueCodeScope.NAME, new GlueCodeScope());
context = (ConfigurableApplicationContext)context.getParent();
- }
- if (context.getParent() == null) {
- context.setParent(parentContext);
- }
+ } while (context != null);
}
}
diff --git a/spring/src/main/resources/cucumber/runtime/java/spring/cucumber-glue.xml b/spring/src/main/resources/cucumber/runtime/java/spring/cucumber-glue.xml
deleted file mode 100644
index ac330b1e01..0000000000
--- a/spring/src/main/resources/cucumber/runtime/java/spring/cucumber-glue.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/AutowiresPlatformTransactionManager.java b/spring/src/test/java/cucumber/runtime/java/spring/AutowiresPlatformTransactionManager.java
new file mode 100644
index 0000000000..b2ede01881
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring/AutowiresPlatformTransactionManager.java
@@ -0,0 +1,15 @@
+package cucumber.runtime.java.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.PlatformTransactionManager;
+
+public class AutowiresPlatformTransactionManager {
+
+ @Autowired
+ private PlatformTransactionManager transactionManager;
+
+ public PlatformTransactionManager getTransactionManager() {
+ return transactionManager;
+ }
+
+}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/AutowiresThirdStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/AutowiresThirdStepDef.java
new file mode 100644
index 0000000000..86127744dc
--- /dev/null
+++ b/spring/src/test/java/cucumber/runtime/java/spring/AutowiresThirdStepDef.java
@@ -0,0 +1,14 @@
+package cucumber.runtime.java.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class AutowiresThirdStepDef {
+
+ @Autowired
+ private ThirdStepDef thirdStepDef;
+
+ public ThirdStepDef getThirdStepDef() {
+ return thirdStepDef;
+ }
+
+}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/NonSpringGlue.java b/spring/src/test/java/cucumber/runtime/java/spring/NonSpringGlue.java
deleted file mode 100644
index 50607a6649..0000000000
--- a/spring/src/test/java/cucumber/runtime/java/spring/NonSpringGlue.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package cucumber.runtime.java.spring;
-
-import cucumber.api.java.Before;
-import cucumber.api.java.en.Given;
-
-public class NonSpringGlue {
-
- @Given("no spring context")
- public void unused() {
- //no test needed
- }
-
- @Before("@unused")
- public void unusedHook() {
- //No hook code needed
- }
-}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
index 6e6cd3fa75..f4c4bd58a8 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
@@ -9,7 +9,11 @@ public class OneStepDef {
int cucumbers;
@Autowired
- ThirdStepDef thirdStepDef;
+ private ThirdStepDef thirdStepDef;
+
+ public ThirdStepDef getThirdStepDef() {
+ return thirdStepDef;
+ }
@Given("^the StepDef injection works$")
public void the_StepDef_injection_works() throws Throwable {
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
index c042b6e0c8..77d614beb5 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
@@ -8,6 +8,7 @@
import cucumber.runtime.java.spring_contexthierarchyconfig.WithDifferentContextHierarchyAnnotation;
import cucumber.runtime.java.spring_dirtiescontextconfig.DirtiesContextBellyStepDefs;
import org.junit.Test;
+import org.springframework.transaction.PlatformTransactionManager;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -37,6 +38,29 @@ public void shouldGiveUsNewStepInstancesForEachScenario() {
assertNotSame(o1, o2);
}
+ @Test
+ public void shouldGiveUsNewInstancesOfGlueScopeClassesForEachScenario() {
+ final ObjectFactory factory = new SpringFactory();
+ factory.addClass(BellyStepdefs.class);
+ factory.addClass(AutowiresPlatformTransactionManager.class);
+
+ // Scenario 1
+ factory.start();
+ final PlatformTransactionManager o1 =
+ factory.getInstance(AutowiresPlatformTransactionManager.class).getTransactionManager();
+ factory.stop();
+
+ // Scenario 2
+ factory.start();
+ final PlatformTransactionManager o2 =
+ factory.getInstance(AutowiresPlatformTransactionManager.class).getTransactionManager();
+ factory.stop();
+
+ assertNotNull(o1);
+ assertNotNull(o2);
+ assertNotSame(o1, o2);
+ }
+
@Test
public void shouldNeverCreateNewApplicationBeanInstances() {
// Feature 1
@@ -58,6 +82,40 @@ public void shouldNeverCreateNewApplicationBeanInstances() {
assertSame(o1, o2);
}
+ @Test
+ public void shouldFindStepDefsCreatedImplicitlyForAutowiring() {
+ final ObjectFactory factory1 = new SpringFactory();
+ factory1.addClass(WithSpringAnnotations.class);
+ factory1.addClass(OneStepDef.class);
+ factory1.addClass(ThirdStepDef.class);
+ factory1.addClass(AutowiresThirdStepDef.class);
+ factory1.start();
+ final OneStepDef o1 = factory1.getInstance(OneStepDef.class);
+ final ThirdStepDef o2 = factory1.getInstance(ThirdStepDef.class);
+ factory1.stop();
+
+ assertNotNull(o1.getThirdStepDef());
+ assertNotNull(o2);
+ assertSame(o1.getThirdStepDef(), o2);
+ }
+
+ @Test
+ public void shouldReuseStepDefsCreatedImplicitlyForAutowiring() {
+ final ObjectFactory factory1 = new SpringFactory();
+ factory1.addClass(WithSpringAnnotations.class);
+ factory1.addClass(OneStepDef.class);
+ factory1.addClass(ThirdStepDef.class);
+ factory1.addClass(AutowiresThirdStepDef.class);
+ factory1.start();
+ final OneStepDef o1 = factory1.getInstance(OneStepDef.class);
+ final AutowiresThirdStepDef o3 = factory1.getInstance(AutowiresThirdStepDef.class);
+ factory1.stop();
+
+ assertNotNull(o1.getThirdStepDef());
+ assertNotNull(o3.getThirdStepDef());
+ assertSame(o1.getThirdStepDef(), o3.getThirdStepDef());
+ }
+
@Test
public void shouldRespectCommonAnnotationsInStepDefs() {
final ObjectFactory factory = new SpringFactory();
@@ -103,17 +161,6 @@ public void shouldRespectDirtiesContextAnnotationsInStepDefs() {
assertNotSame(o1, o2);
}
- @Test
- public void shouldNotFailOnNonSpringStepDefs() {
- final ObjectFactory factory = new SpringFactory();
- factory.addClass(WithSpringAnnotations.class);
- factory.start();
- NonSpringGlue stepdef = factory.getInstance(NonSpringGlue.class);
- factory.stop();
-
- assertNotNull(stepdef);
- }
-
@Test
public void shouldRespectCustomPropertyPlaceholderConfigurer() {
final ObjectFactory factory = new SpringFactory();
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java b/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
index f6698c7ff6..1489ce30cc 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
@@ -5,7 +5,10 @@
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
-@ContextHierarchy(@ContextConfiguration("classpath:cucumber.xml"))
+@ContextHierarchy({
+ @ContextConfiguration("classpath:cucumber2.xml"),
+ @ContextConfiguration("classpath:cucumber.xml")
+ })
public class WithContextHierarchyAnnotation {
private boolean autowired;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
index 121757eb94..906f9c2c28 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
@@ -6,7 +6,7 @@
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
-@CucumberOptions(glue = {"cucumber.runtime.java.spring_dirtiescontextconfig", "cucumber.runtime.java.spring"},
+@CucumberOptions(glue = {"cucumber.runtime.java.spring_dirtiescontextconfig"},
features = {"classpath:cucumber/runtime/java/spring/dirtyCukes.feature"})
public class RunCukesTest {
}
diff --git a/spring/src/test/resources/applicationContext.xml b/spring/src/test/resources/applicationContext.xml
index 8d1e1d92ea..62bd8bf5a4 100644
--- a/spring/src/test/resources/applicationContext.xml
+++ b/spring/src/test/resources/applicationContext.xml
@@ -15,6 +15,6 @@
-
+
diff --git a/spring/src/test/resources/cucumber2.xml b/spring/src/test/resources/cucumber2.xml
new file mode 100644
index 0000000000..d522639cdd
--- /dev/null
+++ b/spring/src/test/resources/cucumber2.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
From 5cad5cf05efda1e711460d24c6362c1c5439ab62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Sun, 18 May 2014 11:02:34 +0200
Subject: [PATCH 13/15] Restructure the test class packages for the spring
module
Make sure that glue classes with different @ContextConfiguration/
@ContextHierarchy annotations are defined in different packages
(since the SpringFactory will throw an exception if glue classes
are added with @ContextConfiguration/@ContextHierarchy annotations
that are not equal).
---
.../runtime/java/spring/SpringFactoryTest.java | 16 +++++++++++-----
.../runtime/java/spring/{ => beans}/Belly.java | 2 +-
.../java/spring/{ => beans}/BellyBean.java | 2 +-
.../java/spring/{ => beans}/DummyComponent.java | 2 +-
.../PlatformTransactionManagerImpl.java | 2 +-
.../java/spring/{ => beans}/TestController.java | 2 +-
.../spring/{ => commonglue}/AnotherStepDef.java | 2 +-
.../AutowiresPlatformTransactionManager.java | 2 +-
.../{ => commonglue}/AutowiresThirdStepDef.java | 2 +-
.../java/spring/{ => commonglue}/OneStepDef.java | 2 +-
.../spring/{ => commonglue}/ThirdStepDef.java | 2 +-
.../{ => commonglue}/TransactionStepDefs.java | 2 +-
.../java/spring/{ => commonglue}/UnusedGlue.java | 2 +-
.../contextconfig}/BellyStepdefs.java | 6 +++---
.../contextconfig}/RunCukesTest.java | 6 +++---
.../contextconfig}/WithSpringAnnotations.java | 4 ++--
.../WithContextHierarchyAnnotation.java | 4 ++--
.../WithDifferentContextHierarchyAnnotation.java | 4 ++--
.../DirtiesContextBellyStepDefs.java | 6 +++---
.../dirtiescontextconfig}/RunCukesTest.java | 4 ++--
.../webappconfig}/RunCukesTest.java | 4 ++--
.../webappconfig}/SpringInjectionStepDefs.java | 2 +-
spring/src/test/resources/applicationContext.xml | 6 +++---
spring/src/test/resources/cucumber.xml | 2 +-
24 files changed, 47 insertions(+), 41 deletions(-)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => beans}/Belly.java (84%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => beans}/BellyBean.java (80%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => beans}/DummyComponent.java (68%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => beans}/PlatformTransactionManagerImpl.java (95%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => beans}/TestController.java (91%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => commonglue}/AnotherStepDef.java (90%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => commonglue}/AutowiresPlatformTransactionManager.java (88%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => commonglue}/AutowiresThirdStepDef.java (83%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => commonglue}/OneStepDef.java (93%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => commonglue}/ThirdStepDef.java (87%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => commonglue}/TransactionStepDefs.java (96%)
rename spring/src/test/java/cucumber/runtime/java/spring/{ => commonglue}/UnusedGlue.java (88%)
rename spring/src/test/java/cucumber/runtime/java/{spring_contextconfig => spring/contextconfig}/BellyStepdefs.java (87%)
rename spring/src/test/java/cucumber/runtime/java/{spring_contextconfig => spring/contextconfig}/RunCukesTest.java (75%)
rename spring/src/test/java/cucumber/runtime/java/{spring_contextconfig => spring/contextconfig}/WithSpringAnnotations.java (85%)
rename spring/src/test/java/cucumber/runtime/java/{spring_contexthierarchyconfig => spring/contexthierarchyconfig}/WithContextHierarchyAnnotation.java (83%)
rename spring/src/test/java/cucumber/runtime/java/{spring_contexthierarchyconfig => spring/contexthierarchyconfig}/WithDifferentContextHierarchyAnnotation.java (81%)
rename spring/src/test/java/cucumber/runtime/java/{spring_dirtiescontextconfig => spring/dirtiescontextconfig}/DirtiesContextBellyStepDefs.java (88%)
rename spring/src/test/java/cucumber/runtime/java/{spring_dirtiescontextconfig => spring/dirtiescontextconfig}/RunCukesTest.java (67%)
rename spring/src/test/java/cucumber/runtime/java/{spring_webappconfig => spring/webappconfig}/RunCukesTest.java (69%)
rename spring/src/test/java/cucumber/runtime/java/{spring_webappconfig => spring/webappconfig}/SpringInjectionStepDefs.java (96%)
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
index 77d614beb5..5d9d39d5ee 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/SpringFactoryTest.java
@@ -2,11 +2,17 @@
import cucumber.runtime.CucumberException;
import cucumber.runtime.java.ObjectFactory;
-import cucumber.runtime.java.spring_contextconfig.BellyStepdefs;
-import cucumber.runtime.java.spring_contextconfig.WithSpringAnnotations;
-import cucumber.runtime.java.spring_contexthierarchyconfig.WithContextHierarchyAnnotation;
-import cucumber.runtime.java.spring_contexthierarchyconfig.WithDifferentContextHierarchyAnnotation;
-import cucumber.runtime.java.spring_dirtiescontextconfig.DirtiesContextBellyStepDefs;
+import cucumber.runtime.java.spring.beans.BellyBean;
+import cucumber.runtime.java.spring.commonglue.AutowiresPlatformTransactionManager;
+import cucumber.runtime.java.spring.commonglue.AutowiresThirdStepDef;
+import cucumber.runtime.java.spring.commonglue.OneStepDef;
+import cucumber.runtime.java.spring.commonglue.ThirdStepDef;
+import cucumber.runtime.java.spring.commonglue.UnusedGlue;
+import cucumber.runtime.java.spring.contextconfig.BellyStepdefs;
+import cucumber.runtime.java.spring.contextconfig.WithSpringAnnotations;
+import cucumber.runtime.java.spring.contexthierarchyconfig.WithContextHierarchyAnnotation;
+import cucumber.runtime.java.spring.contexthierarchyconfig.WithDifferentContextHierarchyAnnotation;
+import cucumber.runtime.java.spring.dirtiescontextconfig.DirtiesContextBellyStepDefs;
import org.junit.Test;
import org.springframework.transaction.PlatformTransactionManager;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/Belly.java b/spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java
similarity index 84%
rename from spring/src/test/java/cucumber/runtime/java/spring/Belly.java
rename to spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java
index 760c74c6d9..8126b1ef80 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/Belly.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/beans/Belly.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.beans;
import org.springframework.stereotype.Component;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/BellyBean.java b/spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java
similarity index 80%
rename from spring/src/test/java/cucumber/runtime/java/spring/BellyBean.java
rename to spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java
index b998b362c9..93c59c7abe 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/BellyBean.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/beans/BellyBean.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.beans;
public class BellyBean {
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/DummyComponent.java b/spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java
similarity index 68%
rename from spring/src/test/java/cucumber/runtime/java/spring/DummyComponent.java
rename to spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java
index ddfa3791d6..50fe8cda6e 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/DummyComponent.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/beans/DummyComponent.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.beans;
import org.springframework.stereotype.Component;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/PlatformTransactionManagerImpl.java b/spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java
similarity index 95%
rename from spring/src/test/java/cucumber/runtime/java/spring/PlatformTransactionManagerImpl.java
rename to spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java
index 3fe18d94e2..9961056a18 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/PlatformTransactionManagerImpl.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/beans/PlatformTransactionManagerImpl.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.beans;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.PlatformTransactionManager;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/TestController.java b/spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java
similarity index 91%
rename from spring/src/test/java/cucumber/runtime/java/spring/TestController.java
rename to spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java
index 5ec0ac201b..118d30408a 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/TestController.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/beans/TestController.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.beans;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java
similarity index 90%
rename from spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
rename to spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java
index d71a9c3498..9b18cbce0a 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/AnotherStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AnotherStepDef.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.commonglue;
import cucumber.api.java.en.Then;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/AutowiresPlatformTransactionManager.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java
similarity index 88%
rename from spring/src/test/java/cucumber/runtime/java/spring/AutowiresPlatformTransactionManager.java
rename to spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java
index b2ede01881..8b15b85e87 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/AutowiresPlatformTransactionManager.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresPlatformTransactionManager.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.commonglue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.PlatformTransactionManager;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/AutowiresThirdStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java
similarity index 83%
rename from spring/src/test/java/cucumber/runtime/java/spring/AutowiresThirdStepDef.java
rename to spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java
index 86127744dc..5ed22fda3d 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/AutowiresThirdStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/AutowiresThirdStepDef.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.commonglue;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java
similarity index 93%
rename from spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
rename to spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java
index f4c4bd58a8..248e7d9dae 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/OneStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/OneStepDef.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.commonglue;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/ThirdStepDef.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java
similarity index 87%
rename from spring/src/test/java/cucumber/runtime/java/spring/ThirdStepDef.java
rename to spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java
index 6430e1b38f..6a1da7ae85 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/ThirdStepDef.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/ThirdStepDef.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.commonglue;
import cucumber.api.java.en.Then;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java
similarity index 96%
rename from spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
rename to spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java
index 417fb62c79..d06b332c7e 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/TransactionStepDefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/TransactionStepDefs.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.commonglue;
import cucumber.api.java.After;
import cucumber.api.java.Before;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring/UnusedGlue.java b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java
similarity index 88%
rename from spring/src/test/java/cucumber/runtime/java/spring/UnusedGlue.java
rename to spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java
index a4f7fef3e5..e6a965b853 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring/UnusedGlue.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/commonglue/UnusedGlue.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring;
+package cucumber.runtime.java.spring.commonglue;
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/BellyStepdefs.java b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java
similarity index 87%
rename from spring/src/test/java/cucumber/runtime/java/spring_contextconfig/BellyStepdefs.java
rename to spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java
index a24955aeda..5906b22955 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/BellyStepdefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/BellyStepdefs.java
@@ -1,9 +1,9 @@
-package cucumber.runtime.java.spring_contextconfig;
+package cucumber.runtime.java.spring.contextconfig;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
-import cucumber.runtime.java.spring.Belly;
-import cucumber.runtime.java.spring.BellyBean;
+import cucumber.runtime.java.spring.beans.Belly;
+import cucumber.runtime.java.spring.beans.BellyBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java
similarity index 75%
rename from spring/src/test/java/cucumber/runtime/java/spring_contextconfig/RunCukesTest.java
rename to spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java
index 724ebe651a..2ca572b61c 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/RunCukesTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/RunCukesTest.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring_contextconfig;
+package cucumber.runtime.java.spring.contextconfig;
import cucumber.api.CucumberOptions;
@@ -6,8 +6,8 @@
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
-@CucumberOptions(glue = {"cucumber.runtime.java.spring_contextconfig",
- "cucumber.runtime.java.spring",
+@CucumberOptions(glue = {"cucumber.runtime.java.spring.contextconfig",
+ "cucumber.runtime.java.spring.commonglue",
"cucumber.api.spring"},
features = {"classpath:cucumber/runtime/java/spring/cukes.feature",
"classpath:cucumber/runtime/java/spring/xmlBasedSpring.feature",
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/WithSpringAnnotations.java b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java
similarity index 85%
rename from spring/src/test/java/cucumber/runtime/java/spring_contextconfig/WithSpringAnnotations.java
rename to spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java
index 99e62ff4c6..a43c91a677 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_contextconfig/WithSpringAnnotations.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/contextconfig/WithSpringAnnotations.java
@@ -1,6 +1,6 @@
-package cucumber.runtime.java.spring_contextconfig;
+package cucumber.runtime.java.spring.contextconfig;
-import cucumber.runtime.java.spring.DummyComponent;
+import cucumber.runtime.java.spring.beans.DummyComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.test.context.ContextConfiguration;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java b/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java
similarity index 83%
rename from spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
rename to spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java
index 1489ce30cc..26367de653 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithContextHierarchyAnnotation.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithContextHierarchyAnnotation.java
@@ -1,6 +1,6 @@
-package cucumber.runtime.java.spring_contexthierarchyconfig;
+package cucumber.runtime.java.spring.contexthierarchyconfig;
-import cucumber.runtime.java.spring.DummyComponent;
+import cucumber.runtime.java.spring.beans.DummyComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java b/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
similarity index 81%
rename from spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
rename to spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
index a6cce743e6..a6afb30ffb 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/contexthierarchyconfig/WithDifferentContextHierarchyAnnotation.java
@@ -1,6 +1,6 @@
-package cucumber.runtime.java.spring_contexthierarchyconfig;
+package cucumber.runtime.java.spring.contexthierarchyconfig;
-import cucumber.runtime.java.spring.DummyComponent;
+import cucumber.runtime.java.spring.beans.DummyComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.ContextHierarchy;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/DirtiesContextBellyStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java
similarity index 88%
rename from spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/DirtiesContextBellyStepDefs.java
rename to spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java
index 6c2527d2a6..052d0b30d8 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/DirtiesContextBellyStepDefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/DirtiesContextBellyStepDefs.java
@@ -1,9 +1,9 @@
-package cucumber.runtime.java.spring_dirtiescontextconfig;
+package cucumber.runtime.java.spring.dirtiescontextconfig;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
-import cucumber.runtime.java.spring.Belly;
-import cucumber.runtime.java.spring.BellyBean;
+import cucumber.runtime.java.spring.beans.Belly;
+import cucumber.runtime.java.spring.beans.BellyBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java
similarity index 67%
rename from spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
rename to spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java
index 906f9c2c28..11b1548ab9 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_dirtiescontextconfig/RunCukesTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/dirtiescontextconfig/RunCukesTest.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring_dirtiescontextconfig;
+package cucumber.runtime.java.spring.dirtiescontextconfig;
import cucumber.api.CucumberOptions;
@@ -6,7 +6,7 @@
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
-@CucumberOptions(glue = {"cucumber.runtime.java.spring_dirtiescontextconfig"},
+@CucumberOptions(glue = {"cucumber.runtime.java.spring.dirtiescontextconfig"},
features = {"classpath:cucumber/runtime/java/spring/dirtyCukes.feature"})
public class RunCukesTest {
}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/RunCukesTest.java b/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java
similarity index 69%
rename from spring/src/test/java/cucumber/runtime/java/spring_webappconfig/RunCukesTest.java
rename to spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java
index bf5c9702bd..c08844da1e 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/RunCukesTest.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/RunCukesTest.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring_webappconfig;
+package cucumber.runtime.java.spring.webappconfig;
import cucumber.api.CucumberOptions;
@@ -6,7 +6,7 @@
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
-@CucumberOptions(glue = {"cucumber.runtime.java.spring_webappconfig"},
+@CucumberOptions(glue = {"cucumber.runtime.java.spring.webappconfig"},
features = {"classpath:cucumber/runtime/java/spring/springinjection.feature"})
public class RunCukesTest {
}
diff --git a/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/SpringInjectionStepDefs.java b/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java
similarity index 96%
rename from spring/src/test/java/cucumber/runtime/java/spring_webappconfig/SpringInjectionStepDefs.java
rename to spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java
index 0005f0254b..f2d142fccf 100644
--- a/spring/src/test/java/cucumber/runtime/java/spring_webappconfig/SpringInjectionStepDefs.java
+++ b/spring/src/test/java/cucumber/runtime/java/spring/webappconfig/SpringInjectionStepDefs.java
@@ -1,4 +1,4 @@
-package cucumber.runtime.java.spring_webappconfig;
+package cucumber.runtime.java.spring.webappconfig;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
diff --git a/spring/src/test/resources/applicationContext.xml b/spring/src/test/resources/applicationContext.xml
index 62bd8bf5a4..48cde6cacb 100644
--- a/spring/src/test/resources/applicationContext.xml
+++ b/spring/src/test/resources/applicationContext.xml
@@ -3,9 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
-
+
-
+
@@ -15,6 +15,6 @@
-
+
diff --git a/spring/src/test/resources/cucumber.xml b/spring/src/test/resources/cucumber.xml
index b765ed137c..bcdffd9788 100644
--- a/spring/src/test/resources/cucumber.xml
+++ b/spring/src/test/resources/cucumber.xml
@@ -4,7 +4,7 @@
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-
+
From de2eeaf5bdc2c9699f343fb0194459184cd9a82d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Rasmusson?=
Date: Sun, 18 May 2014 15:12:29 +0200
Subject: [PATCH 14/15] Improve error message when no spring annotation class
is found
---
.../java/cucumber/runtime/java/spring/SpringFactory.java | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
index b0c6f63a8d..c0bf554fef 100644
--- a/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
+++ b/spring/src/main/java/cucumber/runtime/java/spring/SpringFactory.java
@@ -95,9 +95,8 @@ private boolean isAnnotationInArray(Annotation annotation, Annotation[] annotati
@Override
public void start() {
if (stepClassWithSpringContext == null) {
- throw new CucumberException("No glue class with spring annotation found. " +
- "One glue class with @ContextConfiguration or " +
- "@ContextHierarcy annotation is needed.");
+ throw new CucumberException("No glue class with @ContextConfiguration or " +
+ "@ContextHierarcy annotation found in: " + stepClasses.toString());
}
testContextManager = new CucumberTestContextManager(stepClassWithSpringContext);
notifyContextManagerAboutTestClassStarted();
From a3f4d087679141407a68b4737b9883f005fcafe3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Aslak=20Helles=C3=B8y?=
Date: Mon, 19 May 2014 11:40:38 +0100
Subject: [PATCH 15/15] Demonstrate that Spring transactions are still not
working
cd examples/spring-txn && mvn clean test && mvn test
---
.../src/main/resources/jdbc.properties | 2 +-
.../spring/txn/TransactionCheckHooks.java | 24 +++++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
create mode 100644 examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TransactionCheckHooks.java
diff --git a/examples/spring-txn/src/main/resources/jdbc.properties b/examples/spring-txn/src/main/resources/jdbc.properties
index 3f094e0ae0..ff858d2fcd 100644
--- a/examples/spring-txn/src/main/resources/jdbc.properties
+++ b/examples/spring-txn/src/main/resources/jdbc.properties
@@ -1,5 +1,5 @@
database.driver=org.hsqldb.jdbcDriver
-database.url=jdbc:hsqldb:mem:user
+database.url=jdbc:hsqldb:file:target/db
database.user=sa
database.password=
diff --git a/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TransactionCheckHooks.java b/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TransactionCheckHooks.java
new file mode 100644
index 0000000000..7551ce23ba
--- /dev/null
+++ b/examples/spring-txn/src/test/java/cucumber/examples/spring/txn/TransactionCheckHooks.java
@@ -0,0 +1,24 @@
+package cucumber.examples.spring.txn;
+
+import cucumber.api.java.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+import static org.junit.Assert.assertEquals;
+
+@WebAppConfiguration
+@ContextConfiguration("classpath:cucumber.xml")
+public class TransactionCheckHooks {
+ @Autowired
+ private UserRepository userRepository;
+
+ @Autowired
+ private MessageRepository messageRepository;
+
+ @Before
+ public void verifyEmptyDatabase() {
+ assertEquals(0, userRepository.count());
+ assertEquals(0, messageRepository.count());
+ }
+}