package org.springframework.issues; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.springframework.beans.MutablePropertyValues; import org.springframework.format.support.DefaultFormattingConversionService; import org.springframework.web.bind.WebDataBinder; /** * Unit test that reproduces an issue reported against SPR JIRA. @Test methods within * need not pass with the green bar! Rather they should fail in such a way that * demonstrates the reported issue. */ public class ReproTests { @Test public void stringToString() { TestMap<String, String> source = new TestMap<String, String>(); source.init(); source.put("key", "value"); source.put("key", null); TestMapConsumer target = new TestMapConsumer(); WebDataBinder dataBinder = new WebDataBinder(target, ""); dataBinder.setConversionService(new DefaultFormattingConversionService()); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue("testMap", source); dataBinder.bind(pvs); // FallbackObjectToStringConverter for key-value pairs assertSame(source.keySet().iterator().next(), target.getTestMap().keySet().iterator().next()); assertSame(source.values().iterator().next(), target.getTestMap().values().iterator().next()); assertTrue(target.getTestMap().isInitialized()); } @Test public void numberToNumber() { TestMap<Integer, Integer> source = new TestMap<Integer, Integer>(); source.init(); source.put(new Integer(5), new Integer(6)); TestMapConsumer target = new TestMapConsumer(); WebDataBinder dataBinder = new WebDataBinder(target, ""); dataBinder.setConversionService(new DefaultFormattingConversionService()); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue("testNumberMap", source); dataBinder.bind(pvs); // NumberToNumber converter for key-value pairs assertSame(source.keySet().iterator().next(), target.getTestNumberMap().keySet().iterator().next()); assertSame(source.values().iterator().next(), target.getTestNumberMap().values().iterator().next()); assertTrue(target.getTestNumberMap().isInitialized()); } @Test public void integerToInteger() { TestMap<Integer, Integer> source = new TestMap<Integer, Integer>(); source.init(); source.put(new Integer(5), new Integer(6)); TestMapConsumer target = new TestMapConsumer(); WebDataBinder dataBinder = new WebDataBinder(target, ""); dataBinder.setConversionService(new DefaultFormattingConversionService()); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue("testIntegerMap", source); dataBinder.bind(pvs); // NumberToNumber converter for key-value pairs assertSame(source.keySet().iterator().next(), target.getTestIntegerMap().keySet().iterator().next()); assertSame(source.values().iterator().next(), target.getTestIntegerMap().values().iterator().next()); assertTrue(target.getTestIntegerMap().isInitialized()); } @Test public void assignableKeyValueParis() { TestMap<TestBean, TestBean> source = new TestMap<TestBean, TestBean>(); source.init(); source.put(new TestBean(), new TestBean()); TestMapConsumer target = new TestMapConsumer(); WebDataBinder dataBinder = new WebDataBinder(target, ""); dataBinder.setConversionService(new DefaultFormattingConversionService()); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValue("testBeanMap", source); dataBinder.bind(pvs); // NO_OP converter for key-value pairs (no converter assertSame(source.keySet().iterator().next(), target.getTestBeanMap().keySet().iterator().next()); assertSame(source.values().iterator().next(), target.getTestBeanMap().values().iterator().next()); assertTrue(target.getTestBeanMap().isInitialized()); } }