/** * Copyright (C) 2013-2015 all@code-story.net * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package net.codestory.http.injection; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.mock; import java.util.*; import org.junit.*; import org.junit.rules.*; public class SingletonsTest { static Singletons singletons = new Singletons(); @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void create_instance() { Singleton instance = singletons.get(Singleton.class); assertThat(instance).isNotNull(); } @Test public void create_singleton() { Singleton singleton1 = singletons.get(Singleton.class); Singleton singleton2 = singletons.get(Singleton.class); assertThat(singleton1).isSameAs(singleton2); } @Test public void inject_dependency() { Instance instance = singletons.get(Instance.class); assertThat(instance.singleton).isSameAs(singletons.get(Singleton.class)); } @Test public void inject_dependency_with_multiple_constructors() { DependencyWithMultipleConstructors instance = singletons.get(DependencyWithMultipleConstructors.class); assertThat(instance).isNotNull(); } @Test public void fail_without_public_constructor() { thrown.expect(IllegalStateException.class); singletons.get(Private.class); } @Test public void fail_with_multiple_constructors() { thrown.expect(IllegalStateException.class); singletons.get(Multiple.class); } @Test public void fail_with_invalid_dependency() { thrown.expect(IllegalStateException.class); singletons.get(InvalidDependency.class); } @Test public void fail_with_cycle_dependency() { thrown.expect(IllegalStateException.class); singletons.get(Cycle.class); } @Test public void register_bean_instances() { singletons.register(Number.class, 42); singletons.register(String.class, "The Answer"); Number number = singletons.get(Number.class); String string = singletons.get(String.class); assertThat(number).isEqualTo(42); assertThat(string).isSameAs("The Answer"); } @Test public void register_bean_in_constructor() { Cycle cycle = mock(Cycle.class); Singletons singletons = new Singletons("The Answer", cycle); assertThat(singletons.get(String.class)).isSameAs("The Answer"); assertThat(singletons.get(Cycle.class)).isSameAs(cycle); } static class Singleton { } static class Cycle { public Cycle(Cycle cycle) { } } static class Private { private Private() { } } static class Multiple { public Multiple(Singleton singleton) { } public Multiple(Instance instance) { } } static class InvalidDependency { public InvalidDependency(Integer value) { } } static class DependencyWithMultipleConstructors { public DependencyWithMultipleConstructors(Random random) { } } static class Instance { Singleton singleton; public Instance(Singleton singleton) { this.singleton = singleton; } } }