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

Reply via email to