Last active
January 2, 2020 13:01
-
-
Save 0x4a616e/f2cdb576578baf5ccd0d0655d1eec444 to your computer and use it in GitHub Desktop.
Utility class to manually inject Value-Annotated fields for testing purposes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package de.jangassen.spring.utils; | |
import java.lang.reflect.Field; | |
import java.util.Properties; | |
import org.apache.commons.lang3.reflect.FieldUtils; | |
import org.springframework.beans.factory.annotation.Value; | |
import org.springframework.context.expression.MapAccessor; | |
import org.springframework.core.convert.ConversionService; | |
import org.springframework.core.convert.support.DefaultConversionService; | |
import org.springframework.expression.EvaluationContext; | |
import org.springframework.expression.Expression; | |
import org.springframework.expression.ExpressionParser; | |
import org.springframework.expression.common.TemplateParserContext; | |
import org.springframework.expression.spel.standard.SpelExpressionParser; | |
import org.springframework.expression.spel.support.SimpleEvaluationContext; | |
import org.springframework.util.PropertyPlaceholderHelper; | |
import org.springframework.util.SystemPropertyUtils; | |
public class ValueInjectionUtils { | |
private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser(); | |
private static final ConversionService CONVERSION_SERVICE = new DefaultConversionService(); | |
private static final PropertyPlaceholderHelper PROPERTY_PLACEHOLDER_HELPER = | |
new PropertyPlaceholderHelper(SystemPropertyUtils.PLACEHOLDER_PREFIX, SystemPropertyUtils.PLACEHOLDER_SUFFIX, | |
SystemPropertyUtils.VALUE_SEPARATOR, true); | |
public static void injectFieldValues(Object testClassInstance, Properties properties) { | |
for (Field field : FieldUtils.getFieldsListWithAnnotation(testClassInstance.getClass(), Value.class)) { | |
String value = field.getAnnotation(Value.class).value(); | |
if (value != null) { | |
try { | |
Object resolvedValue = resolveValue(value, properties); | |
FieldUtils.writeField(field, testClassInstance, CONVERSION_SERVICE.convert(resolvedValue, field.getType()), | |
true); | |
} catch (IllegalAccessException e) { | |
throw new IllegalStateException(e); | |
} | |
} | |
} | |
} | |
private static Object resolveValue(String value, Properties properties) { | |
String replacedPlaceholderString = PROPERTY_PLACEHOLDER_HELPER.replacePlaceholders(value, properties); | |
return evaluateSpEL(replacedPlaceholderString, properties); | |
} | |
private static Object evaluateSpEL(String value, Properties properties) { | |
Expression expression = EXPRESSION_PARSER.parseExpression(value, new TemplateParserContext()); | |
EvaluationContext context = | |
SimpleEvaluationContext.forPropertyAccessors(new MapAccessor()).withRootObject(properties).build(); | |
return expression.getValue(context); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment