Hi everybody,
in one of my projects that I use JBehave I had to find a way to write
integration tests,
so I decided to make it using an in memory database, created through Spring
configuration.
I wanted to integrate it with JBehave, in a way that, for each behaviour,
the container should be assembled first,
so that I could use any of its beans. For example:
public class FooBehaviour() extends UsingSpringContext {
public String[] locations() {
return new String[] { "aplication-context.xml" };
}
public void shouldDoSomething() {
Object aBean = bean( "aBean" );
boolean done = aBean.doSomething();
ensureThat(done);
}
}
I'd like to know what do you think about it, if it's a good idea to add to
the project.
Please let me know your opinion.
I'm also attaching a patch for this feature.
Kind regards,
______________________
Alexandre Martins Nunes
http://m.artins.net
Index:
C:/projetos/jbehave/everything/src/behaviour/org/jbehave/AllBehaviours.java
===================================================================
--- C:/projetos/jbehave/everything/src/behaviour/org/jbehave/AllBehaviours.java
(revision 737)
+++ C:/projetos/jbehave/everything/src/behaviour/org/jbehave/AllBehaviours.java
(working copy)
@@ -10,7 +10,8 @@
org.jbehave.classmock.AllBehaviours.class,
org.jbehave.jmock.AllBehaviours.class,
org.jbehave.junit.AllBehaviours.class,
- org.jbehave.threaded.swing.AllBehaviours.class
+ org.jbehave.threaded.swing.AllBehaviours.class,
+ org.jbehave.spring.AllBehaviours.class
};
}
}
Index:
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/BeanProvider.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/BeanProvider.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/BeanProvider.java
(revision 0)
@@ -0,0 +1,8 @@
+package org.jbehave.spring;
+
+/**
+ * @author Alexandre Martins
+ */
+public interface BeanProvider {
+ Object bean(String name);
+}
\ No newline at end of file
Index:
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/SpringApplicationContextProvider.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/SpringApplicationContextProvider.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/SpringApplicationContextProvider.java
(revision 0)
@@ -0,0 +1,44 @@
+package org.jbehave.spring;
+
+import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.support.GenericApplicationContext;
+
+/**
+ * @author Alexandre Martins
+ */
+public class SpringApplicationContextProvider {
+
+ private ConfigurableApplicationContext applicationContext;
+
+ public SpringApplicationContextProvider(String[] locations) {
+ try {
+ loadContextLocations(locations);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Error creating
spring application context with locations [" + locations + "].", e);
+ }
+ }
+
+ public ConfigurableApplicationContext applicationContext() {
+ return applicationContext;
+ }
+
+ public Object bean(String name) {
+ return applicationContext.getBean(name);
+ }
+
+ public void loadContextLocations(String[] locations) {
+ applicationContext = createApplicationContext(locations);
+ }
+
+ public boolean hasActiveApplicationContext() {
+ return applicationContext != null &&
applicationContext.isActive();
+ }
+
+ private ConfigurableApplicationContext
createApplicationContext(String[] locations) {
+ GenericApplicationContext context = new
GenericApplicationContext();
+ new
XmlBeanDefinitionReader(context).loadBeanDefinitions(locations);
+ context.refresh();
+ return context;
+ }
+}
\ No newline at end of file
Index:
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/UsingSpringContext.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/UsingSpringContext.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/java/org/jbehave/spring/UsingSpringContext.java
(revision 0)
@@ -0,0 +1,25 @@
+package org.jbehave.spring;
+
+import org.jbehave.core.mock.UsingMatchers;
+
+/**
+ * @author Alexandre Martins
+ */
+public abstract class UsingSpringContext extends UsingMatchers implements
BeanProvider {
+
+ private SpringApplicationContextProvider contextProvider;
+
+ protected UsingSpringContext() {
+ contextProvider = new
SpringApplicationContextProvider(locations());
+ }
+
+ protected abstract String[] locations();
+
+ protected void reloadContextLocations(String[] locations) {
+ contextProvider.loadContextLocations(locations);
+ }
+
+ public Object bean(String name) {
+ return contextProvider.bean(name);
+ }
+}
\ No newline at end of file
Index:
C:/projetos/jbehave/extensions/spring/src/behaviour/application-context1.xml
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/behaviour/application-context1.xml
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/behaviour/application-context1.xml
(revision 0)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+ 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-2.0.xsd">
+
+ <bean id="aComponent" class="org.jbehave.spring.AComponent" />
+
+</beans>
\ No newline at end of file
Index:
C:/projetos/jbehave/extensions/spring/src/behaviour/application-context2.xml
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/behaviour/application-context2.xml
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/behaviour/application-context2.xml
(revision 0)
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+ 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-2.0.xsd">
+
+ <bean id="anotherComponent" class="org.jbehave.spring.AnotherComponent"
/>
+
+</beans>
\ No newline at end of file
Index:
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AllBehaviours.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AllBehaviours.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AllBehaviours.java
(revision 0)
@@ -0,0 +1,16 @@
+package org.jbehave.spring;
+
+import org.jbehave.core.behaviour.Behaviours;
+
+/**
+ * @author Alexandre Martins
+ */
+public class AllBehaviours implements Behaviours {
+
+ public Class[] getBehaviours() {
+ return new Class[] {
+ SpringApplicationContextProviderBehaviour.class,
+ UsingSpringContextBehaviour.class
+ };
+ }
+}
\ No newline at end of file
Index:
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/UsingSpringContextBehaviour.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/UsingSpringContextBehaviour.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/UsingSpringContextBehaviour.java
(revision 0)
@@ -0,0 +1,34 @@
+package org.jbehave.spring;
+
+import org.jbehave.core.Block;
+import org.jbehave.core.mock.UsingMatchers;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+
+/**
+ * @author Alexandre Martins
+ */
+public class UsingSpringContextBehaviour extends UsingMatchers {
+
+ public void shouldDelegateCorrectlyToContextProvider() throws Exception
{
+ final UsingSpringContext s = new UsingSpringContext() {
+ protected String[] locations() {
+ return new String[] {
"application-context1.xml" };
+ }
+ };
+
+ ensureThat(s.bean("aComponent"), isNotNull());
+ Exception e = runAndCatch(NoSuchBeanDefinitionException.class,
new Block() {
+ public void run() throws Exception {
+ s.bean("anotherComponent");
+ }
+ });
+
+ s.reloadContextLocations(new String[] {
"application-context2.xml" });
+ ensureThat(s.bean("anotherComponent"), isNotNull());
+ e = runAndCatch(NoSuchBeanDefinitionException.class, new
Block() {
+ public void run() throws Exception {
+ s.bean("aComponent");
+ }
+ });
+ }
+}
\ No newline at end of file
Index:
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AnotherComponent.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AnotherComponent.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AnotherComponent.java
(revision 0)
@@ -0,0 +1,4 @@
+package org.jbehave.spring;
+
+public class AnotherComponent {
+}
Index:
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AComponent.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AComponent.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/AComponent.java
(revision 0)
@@ -0,0 +1,4 @@
+package org.jbehave.spring;
+
+public class AComponent {
+}
Index:
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/SpringApplicationContextProviderBehaviour.java
===================================================================
---
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/SpringApplicationContextProviderBehaviour.java
(revision 0)
+++
C:/projetos/jbehave/extensions/spring/src/behaviour/org/jbehave/spring/SpringApplicationContextProviderBehaviour.java
(revision 0)
@@ -0,0 +1,46 @@
+package org.jbehave.spring;
+
+import org.jbehave.core.Block;
+import org.jbehave.core.mock.UsingMatchers;
+
+/**
+ * @author Alexandre Martins
+ */
+public class SpringApplicationContextProviderBehaviour extends UsingMatchers {
+
+ public void shouldReturnErrorWhenReceivingNullContextLocations() throws
Exception {
+ runAndCatch(RuntimeException.class, new Block() {
+ public void run() {
+ SpringApplicationContextProvider provider = new
SpringApplicationContextProvider(null);
+ }
+ });
+ }
+
+ public void shouldReturnErrorWhenReceivingInvalidContextLocations()
throws Exception {
+ runAndCatch(IllegalArgumentException.class, new Block() {
+ public void run() {
+ SpringApplicationContextProvider provider = new
SpringApplicationContextProvider( new String[] { "bla.xml" } );
+ }
+ });
+ }
+
+ public void shouldRetrieveExistentBean() {
+ SpringApplicationContextProvider provider = new
SpringApplicationContextProvider(new String[] {"application-context1.xml"});
+ ensureThat(provider.bean("aComponent"), isNotNull());
+ }
+
+ public void shouldLoadApplicationContextWhenReceivingValidLocations() {
+ SpringApplicationContextProvider provider = new
SpringApplicationContextProvider(new String[] {"application-context1.xml"});
+ ensureThat(provider.hasActiveApplicationContext());
+
ensureThat(provider.applicationContext().containsBean("aComponent"));
+
ensureThat(!provider.applicationContext().containsBean("anotherComponent"));
+ }
+
+ public void
shouldBeAbleToReloadApplicationContextWhenReceivingNewValidLocations() {
+ SpringApplicationContextProvider provider = new
SpringApplicationContextProvider(new String[] {"application-context1.xml"});
+
ensureThat(!provider.applicationContext().containsBean("anotherComponent"));
+ provider.loadContextLocations( new String[] {
"application-context2.xml" } );
+
ensureThat(!provider.applicationContext().containsBean("aComponent"));
+
ensureThat(provider.applicationContext().containsBean("anotherComponent"));
+ }
+}
\ No newline at end of file
Index: C:/projetos/jbehave/.classpath
===================================================================
--- C:/projetos/jbehave/.classpath (revision 737)
+++ C:/projetos/jbehave/.classpath (working copy)
@@ -1,40 +1,44 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="core/src/java"/>
- <classpathentry kind="src" path="core/src/behaviour"/>
- <classpathentry kind="src" path="extensions/ant/src/java"/>
- <classpathentry kind="src" path="extensions/ant/src/behaviour"/>
- <classpathentry kind="src" path="extensions/classmocks/src/behaviour"/>
- <classpathentry kind="src" path="extensions/classmocks/src/java"/>
- <classpathentry kind="src" path="extensions/jmock/src/java"/>
- <classpathentry kind="src" path="extensions/jmock/src/behaviour"/>
- <classpathentry kind="src" path="extensions/junit/src/java"/>
- <classpathentry kind="src" path="extensions/junit/src/behaviour"/>
- <classpathentry kind="src" path="extensions/swing/src/java"/>
- <classpathentry kind="src" path="extensions/swing/src/behaviour"/>
- <classpathentry kind="src" path="plugins/maven/src/main/java"/>
- <classpathentry kind="src" path="everything/src/behaviour"/>
- <classpathentry kind="src" path="examples/atm/src/java"/>
- <classpathentry kind="src" path="examples/atm/src/stories"/>
- <classpathentry kind="src" path="examples/currency/src/java"/>
- <classpathentry kind="src" path="examples/currency/src/behaviour"/>
- <classpathentry kind="src" path="examples/hellbound/src/java"/>
- <classpathentry kind="src" path="examples/hellbound/src/behaviour"/>
- <classpathentry kind="src" path="examples/hellbound/src/stories"/>
- <classpathentry kind="src" path="sandbox/antlr/src/java"/>
- <classpathentry kind="src" path="sandbox/fit/src/java"/>
- <classpathentry kind="src" path="sandbox/fit/src/test"/>
- <classpathentry kind="lib" path="lib/extensions/ant-1.6.5.jar"/>
- <classpathentry kind="lib" path="lib/extensions/antlr-2.7.6.jar"/>
- <classpathentry kind="lib" path="lib/extensions/cglib-full-2.0.jar"/>
- <classpathentry kind="lib" path="lib/extensions/fit-1.1.jar"/>
- <classpathentry kind="lib" path="lib/extensions/jmock-1.1.0.jar"/>
- <classpathentry kind="lib" path="lib/extensions/jmock-cglib-1.1.0.jar"/>
- <classpathentry kind="lib" path="lib/extensions/junit-3.8.2.jar"/>
- <classpathentry kind="lib" path="lib/extensions/proxytoys-0.2.1.jar"/>
- <classpathentry kind="lib" path="lib/extensions/sablecc-3.2.jar"/>
- <classpathentry kind="lib" path="lib/extensions/velocity-dep-1.4.jar"/>
- <classpathentry kind="lib" path="lib/plugins/maven-plugin-api-2.0.jar"/>
- <classpathentry kind="con"
path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="core/src/java"/>
+ <classpathentry kind="src" path="extensions/spring/src/java"/>
+ <classpathentry kind="src" path="extensions/spring/src/behaviour"/>
+ <classpathentry kind="src" path="core/src/behaviour"/>
+ <classpathentry kind="src" path="extensions/ant/src/java"/>
+ <classpathentry kind="src" path="extensions/ant/src/behaviour"/>
+ <classpathentry kind="src" path="extensions/classmocks/src/behaviour"/>
+ <classpathentry kind="src" path="extensions/classmocks/src/java"/>
+ <classpathentry kind="src" path="extensions/jmock/src/java"/>
+ <classpathentry kind="src" path="extensions/jmock/src/behaviour"/>
+ <classpathentry kind="src" path="extensions/junit/src/java"/>
+ <classpathentry kind="src" path="extensions/junit/src/behaviour"/>
+ <classpathentry kind="src" path="extensions/swing/src/java"/>
+ <classpathentry kind="src" path="extensions/swing/src/behaviour"/>
+ <classpathentry kind="src" path="plugins/maven/src/main/java"/>
+ <classpathentry kind="src" path="everything/src/behaviour"/>
+ <classpathentry kind="src" path="examples/atm/src/java"/>
+ <classpathentry kind="src" path="examples/atm/src/stories"/>
+ <classpathentry kind="src" path="examples/currency/src/java"/>
+ <classpathentry kind="src" path="examples/currency/src/behaviour"/>
+ <classpathentry kind="src" path="examples/hellbound/src/java"/>
+ <classpathentry kind="src" path="examples/hellbound/src/behaviour"/>
+ <classpathentry kind="src" path="examples/hellbound/src/stories"/>
+ <classpathentry kind="src" path="sandbox/antlr/src/java"/>
+ <classpathentry kind="src" path="sandbox/fit/src/java"/>
+ <classpathentry kind="src" path="sandbox/fit/src/test"/>
+ <classpathentry kind="lib" path="lib/extensions/ant-1.6.5.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/antlr-2.7.6.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/cglib-full-2.0.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/fit-1.1.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/jmock-1.1.0.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/jmock-cglib-1.1.0.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/junit-3.8.2.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/proxytoys-0.2.1.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/sablecc-3.2.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/velocity-dep-1.4.jar"/>
+ <classpathentry kind="lib" path="lib/plugins/maven-plugin-api-2.0.jar"/>
+ <classpathentry kind="con"
path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="lib" path="lib/extensions/spring.jar"/>
+ <classpathentry kind="lib" path="lib/extensions/commons-logging.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
Index: C:/projetos/jbehave/lib/extensions/commons-logging.jar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes on: C:\projetos\jbehave\lib\extensions\commons-logging.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Index: C:/projetos/jbehave/lib/extensions/spring.jar
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes on: C:\projetos\jbehave\lib\extensions\spring.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email