/** * Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org> * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.seedstack.seed.core; import com.google.inject.ConfigurationException; import com.google.inject.Injector; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.seedstack.seed.Logging; import org.seedstack.seed.core.fixtures.Service1; import org.seedstack.seed.core.fixtures.Service2; import org.seedstack.seed.core.fixtures.Service3; import org.seedstack.seed.core.fixtures.TestSeedInitializer; import org.seedstack.seed.core.rules.SeedITRule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import some.other.pkg.ForeignClass; import javax.annotation.Nullable; import javax.inject.Inject; import static org.assertj.core.api.Assertions.assertThat; public class CorePluginIT { @Rule public SeedITRule rule = new SeedITRule(this); private Injector injector; static class LoggerHolder { private static final Logger logger = LoggerFactory.getLogger(LoggerHolder.class); @Logging protected Logger logger1; } private static class SubLoggerHolder1 extends LoggerHolder { @Logging private Logger logger2; } private static class SubLoggerHolder2 extends LoggerHolder { @Logging private Logger logger2; } private static class HolderNominal { @Inject Service1 s1; @Inject @Nullable Service3 s3; @Inject ForeignClass foreignClass; } private static class HolderException { @Inject Service2 s2; } @Before public void before() { injector = rule.getKernel().objectGraph().as(Injector.class).createChildInjector( binder -> { binder.bind(HolderNominal.class); binder.bind(LoggerHolder.class); binder.bind(SubLoggerHolder1.class); binder.bind(SubLoggerHolder2.class); } ); } @Test public void initializers_are_called() { assertThat(TestSeedInitializer.getCallCount()).isEqualTo(1); } @Test public void modules_are_installed_correctly() { HolderNominal holder = injector.getInstance(HolderNominal.class); assertThat(holder).isNotNull(); assertThat(holder.s1).isNotNull(); assertThat(holder.s3).isNull(); } @Test(expected = ConfigurationException.class) public void modules_without_install_are_not_installed_correctly() { injector.getInstance(HolderException.class); } @Test public void logger_injection_is_working() { LoggerHolder holder = injector.getInstance(LoggerHolder.class); assertThat(LoggerHolder.logger).isNotNull(); assertThat(holder.logger1).isSameAs(LoggerHolder.logger); } @Test public void logger_injection_with_subclasses() { SubLoggerHolder1 subHolder1 = injector.getInstance(SubLoggerHolder1.class); SubLoggerHolder2 subHolder2 = injector.getInstance(SubLoggerHolder2.class); assertThat(subHolder1.logger2).isNotNull(); assertThat(subHolder1.logger1).isNotNull(); assertThat(subHolder2.logger2).isNotNull(); assertThat(subHolder2.logger1).isNotNull(); } @Test public void multiple_package_roots_can_be_used() { HolderNominal holder = injector.getInstance(HolderNominal.class); assertThat(holder.foreignClass).isNotNull(); } }