From eb11070c193d572cf42a96536e0cd73c48126e6e Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Sat, 4 Oct 2025 17:03:20 +0200 Subject: [PATCH] Overhaul and simplify SpEL MapAccessTests --- .../expression/spel/MapAccessTests.java | 148 +++--------------- 1 file changed, 26 insertions(+), 122 deletions(-) diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/MapAccessTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/MapAccessTests.java index 72b9023488d..7f9a5153e8d 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/MapAccessTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/MapAccessTests.java @@ -16,18 +16,13 @@ package org.springframework.expression.spel; -import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Test; import org.springframework.expression.EvaluationContext; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.PropertyAccessor; import org.springframework.expression.TypedValue; import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; import static org.assertj.core.api.Assertions.assertThat; @@ -39,147 +34,56 @@ import static org.assertj.core.api.Assertions.assertThat; class MapAccessTests extends AbstractExpressionTests { @Test - void testSimpleMapAccess01() { + void directMapAccess() { evaluate("testMap.get('monday')", "montag", String.class); } @Test - void testMapAccessThroughIndexer() { + void mapAccessThroughIndexer() { evaluate("testMap['monday']", "montag", String.class); } @Test - void testCustomMapAccessor() { - ExpressionParser parser = new SpelExpressionParser(); - StandardEvaluationContext ctx = TestScenarioCreator.getTestEvaluationContext(); - ctx.addPropertyAccessor(new MapAccessor()); - - Expression expr = parser.parseExpression("testMap.monday"); - Object value = expr.getValue(ctx, String.class); - assertThat(value).isEqualTo("montag"); - } - - @Test - void testVariableMapAccess() { - ExpressionParser parser = new SpelExpressionParser(); - StandardEvaluationContext ctx = TestScenarioCreator.getTestEvaluationContext(); + void variableMapAccess() { + var parser = new SpelExpressionParser(); + var ctx = TestScenarioCreator.getTestEvaluationContext(); ctx.setVariable("day", "saturday"); - Expression expr = parser.parseExpression("testMap[#day]"); - Object value = expr.getValue(ctx, String.class); - assertThat(value).isEqualTo("samstag"); + var expr = parser.parseExpression("testMap[#day]"); + assertThat(expr.getValue(ctx, String.class)).isEqualTo("samstag"); } @Test - void testGetValue() { - Map props1 = new HashMap<>(); - props1.put("key1", "value1"); - props1.put("key2", "value2"); - props1.put("key3", "value3"); - - Object bean = new TestBean("name1", new TestBean("name2", null, "Description 2", 15, props1), "description 1", 6, props1); + void mapAccessOnRoot() { + var map = Map.of("key", "value"); + var parser = new SpelExpressionParser(); + var expr = parser.parseExpression("#root['key']"); - ExpressionParser parser = new SpelExpressionParser(); - Expression expr = parser.parseExpression("testBean.properties['key2']"); - assertThat(expr.getValue(bean)).isEqualTo("value2"); + assertThat(expr.getValue(map)).isEqualTo("value"); } @Test - void testGetValueFromRootMap() { - Map map = new HashMap<>(); - map.put("key", "value"); + void mapAccessOnProperty() { + var properties = Map.of("key", "value"); + var bean = new TestBean(null, new TestBean(properties, null)); - ExpressionParser spelExpressionParser = new SpelExpressionParser(); - Expression expr = spelExpressionParser.parseExpression("#root['key']"); - assertThat(expr.getValue(map)).isEqualTo("value"); + var parser = new SpelExpressionParser(); + var expr = parser.parseExpression("nestedBean.properties['key']"); + assertThat(expr.getValue(bean)).isEqualTo("value"); } + @Test + void mapAccessor() { + var parser = new SpelExpressionParser(); + var ctx = TestScenarioCreator.getTestEvaluationContext(); + ctx.addPropertyAccessor(new MapAccessor()); - public static class TestBean { - - private String name; - private TestBean testBean; - private String description; - private Integer priority; - private Map properties; - - public TestBean(String name, TestBean testBean, String description, Integer priority, Map props) { - this.name = name; - this.testBean = testBean; - this.description = description; - this.priority = priority; - this.properties = props; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public TestBean getTestBean() { - return testBean; - } - - public void setTestBean(TestBean testBean) { - this.testBean = testBean; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Integer getPriority() { - return priority; - } - - public void setPriority(Integer priority) { - this.priority = priority; - } - - public Map getProperties() { - return properties; - } - - public void setProperties(Map properties) { - this.properties = properties; - } + var expr1 = parser.parseExpression("testMap.monday"); + assertThat(expr1.getValue(ctx, String.class)).isEqualTo("montag"); } - public static class MapAccessor implements PropertyAccessor { - - @Override - public boolean canRead(EvaluationContext context, Object target, String name) { - return (((Map) target).containsKey(name)); - } - - @Override - public TypedValue read(EvaluationContext context, Object target, String name) { - return new TypedValue(((Map) target).get(name)); - } - - @Override - public boolean canWrite(EvaluationContext context, Object target, String name) { - return true; - } - - @Override - @SuppressWarnings("unchecked") - public void write(EvaluationContext context, Object target, String name, Object newValue) { - ((Map) target).put(name, newValue); - } - - @Override - public Class[] getSpecificTargetClasses() { - return new Class[] {Map.class}; - } + record TestBean(Map properties, TestBean nestedBean) { } }