diff spring-di-playground/src/test/java/de/comline/spring/QualifierTest.java @ 0:64e2ebad3366

Import des plain Spring DI playground
author Dirk Olmes <dirk.olmes@codedo.de>
date Tue, 11 Aug 2020 16:05:44 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spring-di-playground/src/test/java/de/comline/spring/QualifierTest.java	Tue Aug 11 16:05:44 2020 +0200
@@ -0,0 +1,57 @@
+package de.comline.spring;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+import de.comline.spring.model.ActionMovieCatalog;
+import de.comline.spring.model.ActionMovieLister;
+import de.comline.spring.model.ComedyMovieCatalog;
+import de.comline.spring.model.MovieCatalog;
+
+public class QualifierTest {
+	@Test
+	@DisplayName("Requesting explicit interface type")
+	public void explicitType() {
+		try (ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(ActionMovieCatalog.class, ComedyMovieCatalog.class)) {
+			MovieCatalog action = context.getBean(ActionMovieCatalog.class);
+			assertThat(action.getCategory(), is("Action"));
+		}
+	}
+
+	@Test
+	@DisplayName("Qualifier can be specified at source")
+	public void qualifierAtSource() {
+		// Note how we add multiple interface implementations to the context
+		try (ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(ActionMovieCatalog.class, ComedyMovieCatalog.class, ActionMovieLister.class)) {
+			ActionMovieLister lister = context.getBean(ActionMovieLister.class);
+			assertThat(lister.toString(), containsString("Action"));
+		}
+	}
+
+	@Test
+	@DisplayName("Binding only a single interface implementation")
+	public void singleImplementationOfInterface() {
+		try (ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(ComedyMovieCatalog.class)) {
+			MovieCatalog catalog = context.getBean(MovieCatalog.class);
+			assertThat(catalog.getCategory(), is("Comedy"));
+		}
+	}
+
+	@Test
+	@DisplayName("Multiple implementations of the same interface cannot be injected")
+	public void multipleInterfaceImplementations() {
+		try (ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(ActionMovieCatalog.class, ComedyMovieCatalog.class)) {
+			assertThrows(NoUniqueBeanDefinitionException.class, () -> {
+				context.getBean(MovieCatalog.class);
+			});
+		}
+	}
+}
\ No newline at end of file