From 54a974f707aa12689d336613bb3aa8076ce2245e Mon Sep 17 00:00:00 2001 From: dsyer Date: Tue, 16 Jun 2009 10:23:52 +0000 Subject: [PATCH] Add test case for field specific property editors in BeanWrapperFieldSetMapper --- .../BeanWrapperFieldSetMapperTests.java | 167 +++++++++++++++--- 1 file changed, 139 insertions(+), 28 deletions(-) diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapperTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapperTests.java index 84a023d94..35c561abb 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapperTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/BeanWrapperFieldSetMapperTests.java @@ -16,26 +16,36 @@ package org.springframework.batch.item.file.mapping; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.beans.PropertyEditor; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.Properties; -import junit.framework.TestCase; - +import org.junit.Test; import org.springframework.batch.item.file.transform.DefaultFieldSet; import org.springframework.batch.item.file.transform.FieldSet; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.NotWritablePropertyException; +import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.propertyeditors.CustomNumberEditor; import org.springframework.beans.propertyeditors.PropertiesEditor; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.StaticApplicationContext; +import org.springframework.validation.DataBinder; -public class BeanWrapperFieldSetMapperTests extends TestCase { +public class BeanWrapperFieldSetMapperTests { + @Test public void testNameAndTypeSpecified() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); mapper.setTargetType(TestObject.class); @@ -48,6 +58,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { } } + @Test public void testNameNorTypeSpecified() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); try { @@ -58,6 +69,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { } } + @Test public void testVanillaBeanCreatedFromType() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); mapper.setTargetType(TestObject.class); @@ -71,6 +83,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals('C', result.getVarChar()); } + @Test public void testMapperWithSingleton() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); StaticApplicationContext context = new StaticApplicationContext(); @@ -86,6 +99,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals('C', result.getVarChar()); } + @Test public void testPropertyNameMatching() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); StaticApplicationContext context = new StaticApplicationContext(); @@ -101,11 +115,13 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals('C', result.getVarChar()); } + @Test @SuppressWarnings("unchecked") public void testMapperWithPrototype() throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("bean-wrapper.xml", getClass()); - BeanWrapperFieldSetMapper mapper = (BeanWrapperFieldSetMapper) context.getBean("fieldSetMapper"); + BeanWrapperFieldSetMapper mapper = (BeanWrapperFieldSetMapper) context + .getBean("fieldSetMapper"); FieldSet fieldSet = new DefaultFieldSet(new String[] { "This is some dummy string", "true", "C" }, new String[] { "varString", "varBoolean", "varChar" }); @@ -116,6 +132,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { } + @Test public void testMapperWithNestedBeanPaths() throws Exception { TestNestedA testNestedA = new TestNestedA(); TestNestedB testNestedB = new TestNestedB(); @@ -140,6 +157,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals(2, result.getTestObjectB().getTestObjectC().getValue()); } + @Test public void testMapperWithSimilarNamePropertyMatches() throws Exception { TestNestedA testNestedA = new TestNestedA(); @@ -158,6 +176,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals(1, result.getValueB()); } + @Test public void testMapperWithNotVerySimilarNamePropertyMatches() throws Exception { TestNestedC testNestedC = new TestNestedC(); @@ -176,6 +195,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals(1, result.getValue()); } + @Test public void testMapperWithNestedBeanPathsAndPropertyMatches() throws Exception { TestNestedA testNestedA = new TestNestedA(); TestNestedB testNestedB = new TestNestedB(); @@ -197,6 +217,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals(2, result.getTestObjectB().getTestObjectC().getValue()); } + @Test public void testMapperWithNestedBeanPathsAndPropertyMisMatches() throws Exception { TestNestedA testNestedA = new TestNestedA(); TestNestedB testNestedB = new TestNestedB(); @@ -219,6 +240,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { } } + @Test public void testMapperWithNestedBeanPathsAndPropertyPrefixMisMatches() throws Exception { TestNestedA testNestedA = new TestNestedA(); TestNestedB testNestedB = new TestNestedB(); @@ -241,6 +263,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { } } + @Test public void testPlainBeanWrapper() throws Exception { TestObject result = new TestObject(); BeanWrapperImpl wrapper = new BeanWrapperImpl(result); @@ -255,6 +278,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { // BeanWrapperFieldSetMapper doesn't currently support nesting with // collections. + @Test public void testNestedList() { TestNestedList nestedList = new TestNestedList(); @@ -281,6 +305,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { } + @Test public void testPaddedLongWithNoEditor() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); @@ -292,6 +317,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals(9, bean.getVarLong()); } + @Test public void testPaddedLongWithEditor() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); @@ -306,6 +332,7 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals(9, bean.getVarLong()); } + @Test public void testPaddedLongWithDefaultAndCustomEditor() throws Exception { BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); @@ -321,6 +348,98 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { assertEquals(78, bean.getVarInt()); } + @Test + public void testNumberFormatWithDefaultAndCustomEditor() throws Exception { + + BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); + mapper.setTargetType(TestObject.class); + + FieldSet fieldSet = new DefaultFieldSet(new String[] { "9.876,1", "7,890.1" }, new String[] { "varDouble", + "varFloat" }); + + Map, PropertyEditor> editors = new HashMap, PropertyEditor>(); + editors.put(Double.TYPE, new CustomNumberEditor(Double.class, NumberFormat.getInstance(Locale.GERMAN), true)); + editors.put(Float.TYPE, new CustomNumberEditor(Float.class, NumberFormat.getInstance(Locale.UK), true)); + mapper.setCustomEditors(editors); + + TestObject bean = (TestObject) mapper.mapFieldSet(fieldSet); + + assertEquals(9876.1, bean.getVarDouble(), 0.01); + assertEquals(7890.1, bean.getVarFloat(), 0.01); + } + + @Test + public void testFieldSpecificCustomEditor() throws Exception { + + BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper() { + @Override + protected void initBinder(DataBinder binder) { + binder.registerCustomEditor(Double.TYPE, "value", new CustomNumberEditor(Double.class, NumberFormat + .getNumberInstance(Locale.GERMAN), true)); + } + }; + mapper.setTargetType(TestTwoDoubles.class); + + FieldSet fieldSet = new DefaultFieldSet(new String[] { "9.876,1", "7890.1" }, new String[] { "value", "other" }); + TestTwoDoubles bean = mapper.mapFieldSet(fieldSet); + + assertEquals(9876.1, bean.getValue(), 0.01); + assertEquals(7890.1, bean.getOther(), 0.01); + } + + @Test + public void testFieldSpecificCustomEditorWithRegistry() throws Exception { + + BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper() { + @Override + public void registerCustomEditors(PropertyEditorRegistry registry) { + super.registerCustomEditors(registry); + registry.registerCustomEditor(Double.TYPE, "value", new CustomNumberEditor(Double.class, NumberFormat + .getNumberInstance(Locale.GERMAN), true)); + } + }; + mapper.setTargetType(TestTwoDoubles.class); + + FieldSet fieldSet = new DefaultFieldSet(new String[] { "9.876,1", "7890.1" }, new String[] { "value", "other" }); + TestTwoDoubles bean = mapper.mapFieldSet(fieldSet); + + assertEquals(9876.1, bean.getValue(), 0.01); + assertEquals(7890.1, bean.getOther(), 0.01); + } + + @Test + public void testStrict() throws Exception { + BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); + mapper.setStrict(true); + mapper.setTargetType(TestObject.class); + mapper.afterPropertiesSet(); + + FieldSet fieldSet = new DefaultFieldSet(new String[] { "This is some dummy string", "This won't be mapped", + "true", "C" }, new String[] { "varString", "illegalPropertyName", "varBoolean", "varChar" }); + try { + mapper.mapFieldSet(fieldSet); + fail("expected error"); + } + catch (NotWritablePropertyException e) { + assertTrue(e.getMessage().contains("'illegalPropertyName'")); + } + } + + @Test + public void testNotStrict() throws Exception { + BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); + mapper.setStrict(false); + mapper.setTargetType(TestObject.class); + mapper.afterPropertiesSet(); + + FieldSet fieldSet = new DefaultFieldSet(new String[] { "This is some dummy string", "This won't be mapped", + "true", "C" }, new String[] { "varString", "illegalPropertyName", "varBoolean", "varChar" }); + TestObject result = mapper.mapFieldSet(fieldSet); + assertEquals("This is some dummy string", result.getVarString()); + assertEquals(true, result.isVarBoolean()); + assertEquals('C', result.getVarChar()); + } + private static class TestNestedList { List nestedC; @@ -403,34 +522,26 @@ public class BeanWrapperFieldSetMapperTests extends TestCase { } } - public void testStrict() throws Exception { - BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); - mapper.setStrict(true); - mapper.setTargetType(TestObject.class); - mapper.afterPropertiesSet(); + public static class TestTwoDoubles { + private double value; - FieldSet fieldSet = new DefaultFieldSet(new String[] { "This is some dummy string", "This won't be mapped", - "true", "C" }, new String[] { "varString", "illegalPropertyName", "varBoolean", "varChar" }); - try { - mapper.mapFieldSet(fieldSet); - fail("expected error"); + private double other; + + public double getValue() { + return value; } - catch(NotWritablePropertyException e) { - assertTrue(e.getMessage().contains("'illegalPropertyName'")); + + public void setValue(double value) { + this.value = value; } - } - public void testNotStrict() throws Exception { - BeanWrapperFieldSetMapper mapper = new BeanWrapperFieldSetMapper(); - mapper.setStrict(false); - mapper.setTargetType(TestObject.class); - mapper.afterPropertiesSet(); + public double getOther() { + return other; + } + + public void setOther(double other) { + this.other = other; + } - FieldSet fieldSet = new DefaultFieldSet(new String[] { "This is some dummy string", "This won't be mapped", - "true", "C" }, new String[] { "varString", "illegalPropertyName", "varBoolean", "varChar" }); - TestObject result = mapper.mapFieldSet(fieldSet); - assertEquals("This is some dummy string", result.getVarString()); - assertEquals(true, result.isVarBoolean()); - assertEquals('C', result.getVarChar()); } }