blob: 9588a17bb06aeaef619bf21390e0414a247650e7 [file] [log] [blame]
package ioc.specs
import org.apache.tapestry5.ioc.AnnotationProvider
import org.apache.tapestry5.ioc.ObjectCreator
import org.apache.tapestry5.ioc.ServiceBuilderResources
import org.apache.tapestry5.ioc.internal.FieService
import org.apache.tapestry5.ioc.internal.FoeService
import org.apache.tapestry5.ioc.internal.ServiceBuilderMethodFixture
import org.apache.tapestry5.ioc.internal.ServiceBuilderMethodInvoker
import org.slf4j.Logger
class ServiceBuilderMethodInvokerSpec extends AbstractSharedRegistrySpecification {
static String DESCRIPTION = "{CREATOR DESCRIPTION}"
static String SERVICE_ID = "Fie"
Logger logger = Mock()
FieService implementation = Mock()
ServiceBuilderResources resources = Mock()
ServiceBuilderMethodFixture fixture = new ServiceBuilderMethodFixture();
def setup() {
fixture.fie = implementation
_ * resources.tracker >> tracker
_ * resources.moduleBuilder >> fixture
_ * resources.serviceId >> SERVICE_ID
_ * resources.serviceInterface >> FieService
_ * resources.logger >> logger
}
def "invoke a service builder method with no arguments"() {
when:
ObjectCreator oc = createObjectCreator "build_noargs"
def actual = oc.createObject()
then:
actual.is implementation
}
def ServiceBuilderMethodInvoker createObjectCreator(methodName) {
new ServiceBuilderMethodInvoker(resources, DESCRIPTION,
findMethod(fixture, methodName))
}
def invoke(methodName) {
createObjectCreator(methodName).createObject()
}
def "invoke a method with injected parameters"() {
fixture.expectedServiceInterface = FieService
fixture.expectedServiceResources = resources
fixture.expectedLogger = logger
when:
def actual = invoke "build_args"
then:
actual.is implementation
}
def "@Inject annotation bypasses service resources when resolving value to inject"() {
fixture.expectedString = "Injected"
when:
def actual = invoke "build_with_forced_injection"
then:
actual.is implementation
1 * resources.getObject(String, _ as AnnotationProvider) >> "Injected"
}
def "@InjectService on method parameter"() {
FoeService foe = Mock()
fixture.expectedFoe = foe
when:
def actual = invoke "build_injected"
then:
actual.is implementation
1 * resources.getService("Foe", FoeService) >> foe
}
def "@Named annotation on method parameter"() {
FoeService foe = Mock()
fixture.expectedFoe = foe
when:
def actual = invoke "build_named_injected"
then:
actual.is implementation
1 * resources.getService("Foe", FoeService) >> foe
}
def "injection of ordered configuration as List"() {
List<Runnable> configuration = Mock()
fixture.expectedConfiguration = configuration
when:
def actual = invoke "buildWithOrderedConfiguration"
then:
actual.is implementation
1 * resources.getOrderedConfiguration(Runnable) >> configuration
}
def "injection of unordered collection (as Collection)"() {
Collection<Runnable> configuration = Mock()
fixture.expectedConfiguration = configuration
when:
def actual = invoke "buildWithUnorderedConfiguration"
then:
actual.is implementation
1 * resources.getUnorderedConfiguration(Runnable) >> configuration
}
def "builder method returns null"() {
fixture.fie = null
when:
createObjectCreator("buildWithUnorderedConfiguration").createObject()
then:
RuntimeException e = thrown()
e.message == "Builder method ${DESCRIPTION} (for service 'Fie') returned null."
}
def "builder method failure"() {
when:
createObjectCreator("build_fail").createObject()
then:
RuntimeException e = thrown()
e.message.contains "build_fail()"
e.message.contains "Method failed."
e.cause.message == "Method failed."
}
def "automatically injected dependency (without an annotation)"() {
FoeService foe = Mock()
fixture.expectedFoe = foe
when:
def actual = invoke "build_auto"
then:
actual.is implementation
1 * resources.getObject(FoeService, _ as AnnotationProvider) >> foe
}
}