blob: a746d07025ea588389570f74d4186f9baf639b96 [file] [log] [blame]
package ioc.specs
import org.apache.tapestry5.ioc.internal.ExtraPublicConstructorsModule
import org.apache.tapestry5.ioc.internal.PrivateConstructorModule
import org.apache.tapestry5.ioc.internal.UpcaseService
import org.apache.tapestry5.ioc.*
/**
* A few tests that are easiest (or even just possible) by building a Registry and trying out a few
* things.
*/
class RegistryConstructionAndRuntimeErrorsSpec extends AbstractRegistrySpecification {
def "duplicate service names are a failure"() {
when:
buildRegistry FredModule, DuplicateFredModule
then:
RuntimeException ex = thrown()
ex.message.startsWith "Service id 'Fred' has already been defined by"
// Can't check entire message, can't guarantee what order modules will be processed in
}
def "service with unknown scope fails at service proxy creation"() {
buildRegistry UnknownScopeModule
when:
getService "UnknownScope", Runnable
then:
Exception e = thrown()
e.message.contains "Error building service proxy for service 'UnknownScope'"
e.message.contains "Unknown service scope 'magic'"
}
def "ensure that recursive module construction is detected"() {
buildRegistry RecursiveConstructorModule
def runnable = getService "Runnable", Runnable
when:
// We can get the proxy, but invoking a method causes
// the module to be instantiated ... but that also invokes a method on
// the proxy.
runnable.run()
then:
RuntimeException e = thrown()
e.message.contains "has failed due to recursion"
}
def "a module class must have a public constructor"() {
buildRegistry PrivateConstructorModule
def trigger = getService "Trigger", Runnable
when:
trigger.run()
then:
RuntimeException e = thrown()
e.message.contains "Module class org.apache.tapestry5.ioc.internal.PrivateConstructorModule does not contain any public constructors."
}
def "extra public constructors on a module class are ignored"() {
buildRegistry ExtraPublicConstructorsModule
when: "forcing the module to be instantiated"
def upcase = getService UpcaseService
then: "no exception when instantiating the module"
upcase.upcase('Hello, ${fred}') == "HELLO, FLINTSTONE"
}
def "extra public methods on module classes are exceptions"() {
when:
buildRegistry ExtraMethodsModule
then:
RuntimeException e = thrown()
e.message.contains "Module class org.apache.tapestry5.ioc.ExtraMethodsModule contains unrecognized public methods: "
e.message.contains "thisMethodIsInvalid()"
e.message.contains "soIsThisMethod()"
}
def "can not use withSimpleId() when binding a service interface to a ServiceBuilder callback"() {
when:
buildRegistry NoImplementationClassForSimpleIdModule
then:
RuntimeException e = thrown()
e.message.contains "No defined implementation class to generate simple id from"
}
}