/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.inject; import com.google.inject.Binder; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.multibindings.Multibinder; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import javax.inject.Inject; import javax.inject.Singleton; import java.util.HashSet; import java.util.Set; /** @author andrew00x */ public class MultiBindingTest { Injector injector; @BeforeTest public void init() { injector = Guice.createInjector(new MyModule(), new ServiceModule1(), new ServiceModule2(), new ServiceModule3()); } @Test public void testMultiInject() { TestComponent instance = injector.getInstance(TestComponent.class); Set<Service> services = instance.services; Set<String> names = new HashSet<>(services.size()); for (Service service : services) { names.add(service.toString()); } Assert.assertEquals(names.size(), 3); Assert.assertTrue(names.contains("Service1")); Assert.assertTrue(names.contains("Service2")); Assert.assertTrue(names.contains("Service3")); } public static class MyModule implements Module { @Override public void configure(Binder binder) { binder.bind(TestComponent.class); } } public static class ServiceModule1 implements Module { @Override public void configure(Binder binder) { Multibinder<Service> multiBinder = Multibinder.newSetBinder(binder, Service.class); multiBinder.addBinding().to(Service1.class); } } public static class ServiceModule2 implements Module { @Override public void configure(Binder binder) { Multibinder<Service> multiBinder = Multibinder.newSetBinder(binder, Service.class); multiBinder.addBinding().to(Service2.class); } } public static class ServiceModule3 implements Module { @Override public void configure(Binder binder) { Multibinder<Service> multiBinder = Multibinder.newSetBinder(binder, Service.class); multiBinder.addBinding().to(Service3.class); } } @Singleton public static class TestComponent { private final Set<Service> services; @Inject public TestComponent(Set<Service> services) { this.services = services; } } public interface Service { } @Singleton public static class Service1 implements Service { @Override public String toString() { return "Service1"; } } @Singleton public static class Service2 implements Service { @Override public String toString() { return "Service2"; } } @Singleton public static class Service3 implements Service { @Override public String toString() { return "Service3"; } } }