Home / Class/ NoUnboundElementsBindHandlerTests Class — spring-boot Architecture

NoUnboundElementsBindHandlerTests Class — spring-boot Architecture

Architecture documentation for the NoUnboundElementsBindHandlerTests class in NoUnboundElementsBindHandlerTests.java from the spring-boot codebase.

Entity Profile

Relationship Graph

Source Code

core/spring-boot/src/test/java/org/springframework/boot/context/properties/bind/handler/NoUnboundElementsBindHandlerTests.java lines 42–274

class NoUnboundElementsBindHandlerTests {

	private final List<ConfigurationPropertySource> sources = new ArrayList<>();

	private @Nullable Binder binder;

	@Test
	void bindWhenNotUsingNoUnboundElementsHandlerShouldBind() {
		MockConfigurationPropertySource source = new MockConfigurationPropertySource();
		source.put("example.foo", "bar");
		source.put("example.baz", "bar");
		this.sources.add(source);
		this.binder = new Binder(this.sources);
		Example bound = this.binder.bind(ConfigurationPropertyName.of("example"), Bindable.of(Example.class)).get();
		assertThat(bound.getFoo()).isEqualTo("bar");
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerShouldBind() {
		MockConfigurationPropertySource source = new MockConfigurationPropertySource();
		source.put("example.foo", "bar");
		this.sources.add(source);
		this.binder = new Binder(this.sources);
		Example bound = this.binder.bind("example", Bindable.of(Example.class), new NoUnboundElementsBindHandler())
			.get();
		assertThat(bound.getFoo()).isEqualTo("bar");
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerThrowException() {
		MockConfigurationPropertySource source = new MockConfigurationPropertySource();
		source.put("example.foo", "bar");
		source.put("example.baz", "bar");
		this.sources.add(source);
		this.binder = new Binder(this.sources);
		assertThatExceptionOfType(BindException.class).isThrownBy(() -> {
			assertThat(this.binder).isNotNull();
			this.binder.bind("example", Bindable.of(Example.class), new NoUnboundElementsBindHandler());
		}).satisfies((ex) -> {
			Throwable cause = ex.getCause();
			assertThat(cause).isNotNull();
			assertThat(cause.getMessage()).contains("The elements [example.baz] were left unbound");
		});
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerShouldBindIfPrefixDifferent() {
		MockConfigurationPropertySource source = new MockConfigurationPropertySource();
		source.put("example.foo", "bar");
		source.put("other.baz", "bar");
		this.sources.add(source);
		this.binder = new Binder(this.sources);
		Example bound = this.binder.bind("example", Bindable.of(Example.class), new NoUnboundElementsBindHandler())
			.get();
		assertThat(bound.getFoo()).isEqualTo("bar");
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerShouldBindIfUnboundSystemProperties() {
		MockConfigurationPropertySource source = new MockConfigurationPropertySource();
		source.put("example.foo", "bar");
		source.put("example.other", "baz");
		this.sources.add(source);
		this.binder = new Binder(this.sources);
		NoUnboundElementsBindHandler handler = new NoUnboundElementsBindHandler(BindHandler.DEFAULT,
				((configurationPropertySource) -> false));
		Example bound = this.binder.bind("example", Bindable.of(Example.class), handler).get();
		assertThat(bound.getFoo()).isEqualTo("bar");
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerShouldBindIfUnboundCollectionProperties() {
		MockConfigurationPropertySource source1 = new MockConfigurationPropertySource();
		source1.put("example.foo[0]", "bar");
		MockConfigurationPropertySource source2 = new MockConfigurationPropertySource();
		source2.put("example.foo[0]", "bar");
		source2.put("example.foo[1]", "baz");
		this.sources.add(source1);
		this.sources.add(source2);
		this.binder = new Binder(this.sources);
		NoUnboundElementsBindHandler handler = new NoUnboundElementsBindHandler();
		ExampleWithList bound = this.binder.bind("example", Bindable.of(ExampleWithList.class), handler).get();
		assertThat(bound.getFoo()).containsExactly("bar");
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerAndUnboundListElementsShouldThrowException() {
		MockConfigurationPropertySource source = new MockConfigurationPropertySource();
		source.put("example.foo[0]", "bar");
		this.sources.add(source);
		this.binder = new Binder(this.sources);
		assertThatExceptionOfType(BindException.class).isThrownBy(() -> {
			assertThat(this.binder).isNotNull();
			this.binder.bind("example", Bindable.of(Example.class), new NoUnboundElementsBindHandler());
		}).satisfies((ex) -> {
			Throwable cause = ex.getCause();
			assertThat(cause).isNotNull();
			assertThat(cause.getMessage()).contains("The elements [example.foo[0]] were left unbound");
		});
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerShouldBindIfUnboundNestedCollectionProperties() {
		MockConfigurationPropertySource source1 = new MockConfigurationPropertySource();
		source1.put("example.nested[0].string-value", "bar");
		MockConfigurationPropertySource source2 = new MockConfigurationPropertySource();
		source2.put("example.nested[0].string-value", "bar");
		source2.put("example.nested[0].int-value", "2");
		source2.put("example.nested[1].string-value", "baz");
		source2.put("example.nested[1].other-nested.baz", "baz");
		this.sources.add(source1);
		this.sources.add(source2);
		this.binder = new Binder(this.sources);
		NoUnboundElementsBindHandler handler = new NoUnboundElementsBindHandler();
		ExampleWithNestedList bound = this.binder.bind("example", Bindable.of(ExampleWithNestedList.class), handler)
			.get();
		List<Nested> nested = bound.getNested();
		assertThat(nested).isNotNull();
		assertThat(nested.get(0).getStringValue()).isEqualTo("bar");
	}

	@Test
	void bindWhenUsingNoUnboundElementsHandlerAndUnboundCollectionElementsWithInvalidPropertyShouldThrowException() {
		MockConfigurationPropertySource source1 = new MockConfigurationPropertySource();
		source1.put("example.nested[0].string-value", "bar");
		MockConfigurationPropertySource source2 = new MockConfigurationPropertySource();
		source2.put("example.nested[0].string-value", "bar");
		source2.put("example.nested[1].int-value", "1");
		source2.put("example.nested[1].invalid", "baz");
		this.sources.add(source1);
		this.sources.add(source2);
		this.binder = new Binder(this.sources);
		assertThatExceptionOfType(BindException.class).isThrownBy(() -> {
			assertThat(this.binder).isNotNull();
			this.binder.bind("example", Bindable.of(ExampleWithNestedList.class), new NoUnboundElementsBindHandler());
		}).satisfies((ex) -> {
			Throwable cause = ex.getCause();
			assertThat(cause).isNotNull();
			assertThat(cause.getMessage()).contains("The elements [example.nested[1].invalid] were left unbound");
		});
	}

	static class Example {

		private @Nullable String foo;

		@Nullable String getFoo() {
			return this.foo;
		}

		void setFoo(@Nullable String foo) {
			this.foo = foo;
		}

	}

	static class ExampleWithList {

		private @Nullable List<String> foo;

		@Nullable List<String> getFoo() {
			return this.foo;
		}

		void setFoo(@Nullable List<String> foo) {
			this.foo = foo;
		}

	}

	static class ExampleWithNestedList {

		private @Nullable List<Nested> nested;

		@Nullable List<Nested> getNested() {
			return this.nested;
		}

		void setNested(@Nullable List<Nested> nested) {
			this.nested = nested;
		}

	}

	static class Nested {

		private @Nullable String stringValue;

		private @Nullable Integer intValue;

		private @Nullable OtherNested otherNested;

		@Nullable String getStringValue() {
			return this.stringValue;
		}

		void setStringValue(@Nullable String value) {
			this.stringValue = value;
		}

		@Nullable Integer getIntValue() {
			return this.intValue;
		}

		void setIntValue(@Nullable Integer intValue) {
			this.intValue = intValue;
		}

		@Nullable OtherNested getOtherNested() {
			return this.otherNested;
		}

		void setOtherNested(@Nullable OtherNested otherNested) {
			this.otherNested = otherNested;
		}

	}

	static class OtherNested {

		private @Nullable String baz;

		@Nullable String getBaz() {
			return this.baz;
		}

		void setBaz(@Nullable String baz) {
			this.baz = baz;
		}

	}

}

Domain

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free