ConfigurableEmbedder.java
package org.jbehave.core;
import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.embedder.Embedder;
import org.jbehave.core.junit.JUnitStories;
import org.jbehave.core.steps.InjectableStepsFactory;
/**
* <p>
* Abstract implementation of {@link Embeddable} which extends {@link InjectableEmbedder}
* to allow the configuration using the {@link Configuration} and
* the {@link InjectableStepsFactory} specified.
* </p>
* <p>
* The instances of the {@link Configuration} and the
* {@link InjectableStepsFactory} can be provided either via the
* {@link #useConfiguration(Configuration)} and
* {@link #useStepsFactory(InjectableStepsFactory)} methods or overriding the
* {@link #configuration()} and {@link #stepsFactory()} methods.
* </p>
* <p>
* If overriding the {@link #configuration()} method and providing an
* {@link InjectableStepsFactory} which requires a {@link Configuration}, then
* care must be taken to avoid re-instantiating the {@link Configuration}. E.g.:
*
* <pre>
* <code>public Configuration configuration() {
* if (super.hasConfiguration()) {
* return super.configuration();
* }
* return new MostUsefulConfiguration()...;
* }</code>
* </pre>
*
* </p>
* <p>
* Note that no defaults are provided by this implementation. If no values are
* set by the subclasses, then <code>null</code> values are passed to the
* configured {@link Embedder}, which is responsible for setting the default
* values.
* </p>
* <p>
* Typically, users that use JUnit will find it easier to extend other
* implementations, such as {@link JUnitStories} which
* implement the {@link #run()} using the configured {@link Embedder} and
* annotate it with JUnit's annotations.
* </p>
*/
public abstract class ConfigurableEmbedder extends InjectableEmbedder {
private Configuration configuration;
private InjectableStepsFactory stepsFactory;
public void useConfiguration(Configuration configuration) {
this.configuration = configuration;
}
public Configuration configuration() {
return configuration;
}
public boolean hasConfiguration() {
return configuration != null;
}
public void useStepsFactory(InjectableStepsFactory stepsFactory) {
this.stepsFactory = stepsFactory;
}
public InjectableStepsFactory stepsFactory() {
return stepsFactory;
}
public boolean hasStepsFactory() {
return stepsFactory != null;
}
public Embedder configuredEmbedder() {
if (configuration == null) {
configuration = configuration();
}
Embedder embedder = injectedEmbedder();
embedder.useConfiguration(configuration);
if (stepsFactory == null) {
stepsFactory = stepsFactory();
}
embedder.useStepsFactory(stepsFactory);
return embedder;
}
}