package ru.vyarus.dropwizard.guice.test.spock.ext; import io.dropwizard.testing.ConfigOverride; import org.spockframework.runtime.extension.AbstractAnnotationDrivenExtension; import org.spockframework.runtime.model.SpecInfo; import java.lang.annotation.Annotation; /** * Base class for guicey spock extensions. Extensions use junit rules inside to avoid duplication. * * @param <T> extension annotation * @author Vyacheslav Rusakov * @since 03.01.2015 */ public abstract class AbstractAppExtension<T extends Annotation> extends AbstractAnnotationDrivenExtension<T> { private T annotation; @Override public void visitSpecAnnotation(final T useApplication, final SpecInfo spec) { this.annotation = useApplication; } @Override public void visitSpec(final SpecInfo spec) { final GuiceyInterceptor interceptor = new GuiceyInterceptor(spec, buildResourceFactory(annotation)); final SpecInfo topSpec = spec.getTopSpec(); topSpec.addSharedInitializerInterceptor(interceptor); topSpec.addInitializerInterceptor(interceptor); topSpec.addCleanupSpecInterceptor(interceptor); } /** * @param annotation extension annotation instance * @return resource factory instance, which will create correct rule instance */ protected abstract GuiceyInterceptor.ExternalRuleAdapter buildResourceFactory(T annotation); /** * Utility method to convert configuration overrides from annotation to rule compatible format. * * @param overrides override annotations * @return dropwizard config override objects */ protected ConfigOverride[] convertOverrides( final ru.vyarus.dropwizard.guice.test.spock.ConfigOverride... overrides) { final ConfigOverride[] configOverride = new ConfigOverride[overrides.length]; int i = 0; for (ru.vyarus.dropwizard.guice.test.spock.ConfigOverride override : overrides) { configOverride[i++] = ConfigOverride.config(override.key(), override.value()); } return configOverride; } }