Class GuiceyExtensionsSupport

  • All Implemented Interfaces:
    org.junit.jupiter.api.extension.AfterAllCallback, org.junit.jupiter.api.extension.BeforeAllCallback, org.junit.jupiter.api.extension.BeforeEachCallback, org.junit.jupiter.api.extension.Extension, org.junit.jupiter.api.extension.ParameterResolver
    Direct Known Subclasses:
    TestDropwizardAppExtension, TestGuiceyAppExtension

    public abstract class GuiceyExtensionsSupport
    extends TestParametersSupport
    implements org.junit.jupiter.api.extension.BeforeAllCallback, org.junit.jupiter.api.extension.AfterAllCallback, org.junit.jupiter.api.extension.BeforeEachCallback
    Base class for junit 5 extensions implementations. All extensions use DropwizardTestSupport object for actual execution (only configuration differs).

    Extensions assumed to be used only on class level: extension will start dropwizard app before all tests and shut down it after all tests. If nested tests used - they also affected. Execution per test is not allowed because these tests are integration tests and they must minimize environment preparation time. Group tests not affecting application state into one class and use different test classes (or nested classes) for tests modifying state.

    Test instance is not managed by guice! Only Injector.injectMembers(Object) applied for it to process test fields injection. Guice AOP can't be used on test methods. Technically, creating test instances with guice is possible, but in this case nested tests could not work at all, which is unacceptable.

    Extension detects static fields of GuiceyConfigurationHook type, annotated with EnableHook and initialize these hooks automatically. It was done like this to simplify customizations, when main extension could be declared as annotation and hook as field. Also, it was impossible to implement hooks support with junit extension. Hook field could be declared even in base test class.

    For external integrations (other extensions), there is a special "hack" allowing to access DropwizardTestSupport object (and so get access to injector): lookupSupport(ExtensionContext). And shortcuts lookupInjector(ExtensionContext) and lookupClient(ExtensionContext).

    Since:
    29.04.2020
    See Also:
    for supported test parameters
    • Method Summary

      All Methods Static Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      void afterAll​(org.junit.jupiter.api.extension.ExtensionContext context)  
      void beforeAll​(org.junit.jupiter.api.extension.ExtensionContext context)  
      void beforeEach​(org.junit.jupiter.api.extension.ExtensionContext context)  
      protected ClientSupport getClient​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)  
      protected static org.junit.jupiter.api.extension.ExtensionContext.Store getExtensionStore​(org.junit.jupiter.api.extension.ExtensionContext context)  
      protected java.util.Optional<com.google.inject.Injector> getInjector​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)  
      protected io.dropwizard.testing.DropwizardTestSupport<?> getSupport​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)  
      static java.util.Optional<ClientSupport> lookupClient​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
      Shortcut for ClientSupport object lookup by other extensions.
      static java.util.Optional<com.google.inject.Injector> lookupInjector​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
      Shortcut for application injector resolution be used by other extensions.
      static java.util.Optional<io.dropwizard.testing.DropwizardTestSupport<?>> lookupSupport​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
      Static "hack" for other extensions extending base guicey extensions abilities.
      protected void onShutdown​(org.junit.jupiter.api.extension.ExtensionContext context)
      Hook to perform additional work after server shutdown.
      protected abstract io.dropwizard.testing.DropwizardTestSupport<?> prepareTestSupport​(org.junit.jupiter.api.extension.ExtensionContext context)
      The only role of actual extension class is to configure DropwizardTestSupport object according to annotated configuration.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • GuiceyExtensionsSupport

        public GuiceyExtensionsSupport()
    • Method Detail

      • beforeAll

        public void beforeAll​(org.junit.jupiter.api.extension.ExtensionContext context)
                       throws java.lang.Exception
        Specified by:
        beforeAll in interface org.junit.jupiter.api.extension.BeforeAllCallback
        Throws:
        java.lang.Exception
      • beforeEach

        public void beforeEach​(org.junit.jupiter.api.extension.ExtensionContext context)
        Specified by:
        beforeEach in interface org.junit.jupiter.api.extension.BeforeEachCallback
      • afterAll

        public void afterAll​(org.junit.jupiter.api.extension.ExtensionContext context)
                      throws java.lang.Exception
        Specified by:
        afterAll in interface org.junit.jupiter.api.extension.AfterAllCallback
        Throws:
        java.lang.Exception
      • lookupSupport

        public static java.util.Optional<io.dropwizard.testing.DropwizardTestSupport<?>> lookupSupport​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
        Static "hack" for other extensions extending base guicey extensions abilities.

        The only thin moment here is extensions order! Junit preserve declaration order so in most cases it should not be a problem.

        Parameters:
        extensionContext - extension context
        Returns:
        dropwizard support object prepared by guicey extension, or null if no guicey extension used or its beforeAll hook was not called yet
      • lookupInjector

        public static java.util.Optional<com.google.inject.Injector> lookupInjector​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
        Shortcut for application injector resolution be used by other extensions.

        Custom extension must be activated after main guicey extension!

        Parameters:
        extensionContext - extension context
        Returns:
        application injector or null if not available
      • lookupClient

        public static java.util.Optional<ClientSupport> lookupClient​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
        Shortcut for ClientSupport object lookup by other extensions.

        Custom extension must be activated after main guicey extension!

        Parameters:
        extensionContext - extension context
        Returns:
        client factory object or null if not available
      • prepareTestSupport

        protected abstract io.dropwizard.testing.DropwizardTestSupport<?> prepareTestSupport​(org.junit.jupiter.api.extension.ExtensionContext context)
        The only role of actual extension class is to configure DropwizardTestSupport object according to annotated configuration.
        Parameters:
        context - extension context
        Returns:
        configured dropwizard test support object
      • onShutdown

        protected void onShutdown​(org.junit.jupiter.api.extension.ExtensionContext context)
        Hook to perform additional work after server shutdown. Useful for custom commands in order to shutdown properly.
        Parameters:
        context - test context
      • getSupport

        protected io.dropwizard.testing.DropwizardTestSupport<?> getSupport​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
        Specified by:
        getSupport in class TestParametersSupport
        Parameters:
        extensionContext - junit extension context
        Returns:
        dropwizard test support object assigned to test instance or null
      • getClient

        protected ClientSupport getClient​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
        Specified by:
        getClient in class TestParametersSupport
        Parameters:
        extensionContext - junit extension context
        Returns:
        client factory object assigned to test instance (never null)
      • getInjector

        protected java.util.Optional<com.google.inject.Injector> getInjector​(org.junit.jupiter.api.extension.ExtensionContext extensionContext)
        Specified by:
        getInjector in class TestParametersSupport
        Parameters:
        extensionContext - junit extension context
        Returns:
        application injector or null
      • getExtensionStore

        protected static org.junit.jupiter.api.extension.ExtensionContext.Store getExtensionStore​(org.junit.jupiter.api.extension.ExtensionContext context)