/*
* Copyright 2012-2016 the original author or authors.
*
* 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 org.springframework.boot.test.autoconfigure.properties;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.test.context.ContextCustomizer;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verifyZeroInteractions;
/**
* Tests for {@link PropertyMappingContextCustomizerFactory}.
*
* @author Phillip Webb
*/
public class PropertyMappingContextCustomizerFactoryTests {
@Rule
public ExpectedException thrown = ExpectedException.none();
private PropertyMappingContextCustomizerFactory factory = new PropertyMappingContextCustomizerFactory();
@Test
public void getContextCustomizerWhenHasNoMappingShouldNotAddPropertySource() {
ContextCustomizer customizer = this.factory
.createContextCustomizer(NoMapping.class, null);
ConfigurableApplicationContext context = mock(
ConfigurableApplicationContext.class);
ConfigurableEnvironment environment = mock(ConfigurableEnvironment.class);
ConfigurableListableBeanFactory beanFactory = mock(
ConfigurableListableBeanFactory.class);
given(context.getEnvironment()).willReturn(environment);
given(context.getBeanFactory()).willReturn(beanFactory);
customizer.customizeContext(context, null);
verifyZeroInteractions(environment);
}
@Test
public void getContextCustomizerWhenHasTypeMappingShouldReturnCustomizer() {
ContextCustomizer customizer = this.factory
.createContextCustomizer(TypeMapping.class, null);
assertThat(customizer).isNotNull();
}
@Test
public void getContextCustomizerWhenHasAttributeMappingShouldReturnCustomizer() {
ContextCustomizer customizer = this.factory
.createContextCustomizer(AttributeMapping.class, null);
assertThat(customizer).isNotNull();
}
@Test
public void hashCodeAndEqualsShouldBeBasedOnPropertyValues() throws Exception {
ContextCustomizer customizer1 = this.factory
.createContextCustomizer(TypeMapping.class, null);
ContextCustomizer customizer2 = this.factory
.createContextCustomizer(AttributeMapping.class, null);
ContextCustomizer customizer3 = this.factory
.createContextCustomizer(OtherMapping.class, null);
assertThat(customizer1.hashCode()).isEqualTo(customizer2.hashCode());
assertThat(customizer1).isEqualTo(customizer1).isEqualTo(customizer2)
.isNotEqualTo(customizer3);
}
@Test
public void prepareContextShouldAddPropertySource() throws Exception {
ContextCustomizer customizer = this.factory
.createContextCustomizer(AttributeMapping.class, null);
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
customizer.customizeContext(context, null);
assertThat(context.getEnvironment().getProperty("mapped")).isEqualTo("Mapped");
}
@Test
public void propertyMappingShouldNotBeUsedWithComponent() throws Exception {
ContextCustomizer customizer = this.factory
.createContextCustomizer(AttributeMapping.class, null);
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(ConfigMapping.class);
customizer.customizeContext(context, null);
this.thrown.expect(BeanCreationException.class);
this.thrown.expectMessage("The @PropertyMapping annotation "
+ "@PropertyMappingContextCustomizerFactoryTests.TypeMappingAnnotation "
+ "cannot be used in combination with the @Component annotation @Configuration");
context.refresh();
}
@NoMappingAnnotation
static class NoMapping {
}
@Retention(RetentionPolicy.RUNTIME)
static @interface NoMappingAnnotation {
}
@TypeMappingAnnotation
static class TypeMapping {
}
@Configuration
@TypeMappingAnnotation
static class ConfigMapping {
}
@Retention(RetentionPolicy.RUNTIME)
@PropertyMapping
static @interface TypeMappingAnnotation {
String mapped() default "Mapped";
}
@AttributeMappingAnnotation
static class AttributeMapping {
}
@AttributeMappingAnnotation("Other")
static class OtherMapping {
}
@Retention(RetentionPolicy.RUNTIME)
static @interface AttributeMappingAnnotation {
@PropertyMapping("mapped")
String value() default "Mapped";
}
}