package org.jbehave.examples.core.needle;
import static org.needle4j.common.Annotations.assertIsQualifier;
import java.lang.annotation.Annotation;
import org.jbehave.core.InjectableEmbedder;
import org.jbehave.core.annotations.Configure;
import org.jbehave.core.annotations.UsingEmbedder;
import org.jbehave.core.annotations.needle.UsingNeedle;
import org.jbehave.core.embedder.Embedder;
import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
import org.jbehave.examples.core.needle.ParentAnnotatedEmbedderUsingNeedle.TradingServiceInjectionProvider;
import org.jbehave.examples.core.service.TradingService;
import org.junit.runner.RunWith;
import org.needle4j.injection.InjectionProvider;
import org.needle4j.injection.InjectionTargetInformation;
@RunWith(NeedleAnnotatedEmbedderRunner.class)
@Configure()
@UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
@UsingNeedle(provider = TradingServiceInjectionProvider.class)
public abstract class ParentAnnotatedEmbedderUsingNeedle extends InjectableEmbedder {
/**
* Inline provider
*
* @author Simon Zambrovski
*
*/
public static class TradingServiceInjectionProvider implements InjectionProvider<TradingService> {
protected final TradingService instance = new TradingService();
public TradingServiceInjectionProvider() {
}
public Object getKey(final InjectionTargetInformation injectionTargetInformation) {
return injectionTargetInformation.getType();
}
public boolean verify(final InjectionTargetInformation injectionTargetInformation) {
return isTargetAssignable(injectionTargetInformation);
}
public TradingService getInjectedObject(Class<?> injectionPointType) {
return instance;
}
/**
* <code>true</code> when injection target is or extends/implements instance
* type
*
* @param injectionTargetInformation
* @return true when type is assignable from instance
*/
protected boolean isTargetAssignable(final InjectionTargetInformation injectionTargetInformation) {
return injectionTargetInformation.getType().isAssignableFrom(instance.getClass());
}
protected boolean isTargetQualifierPresent(final InjectionTargetInformation injectionTargetInformation, final Class<? extends Annotation> qualifier) {
assertIsQualifier(qualifier);
return injectionTargetInformation.isAnnotationPresent(qualifier);
}
}
}