package org.simpleflatmapper.csv.test.samples; import org.junit.Test; import org.simpleflatmapper.csv.CellValueReader; import org.simpleflatmapper.csv.CsvMapperFactory; import org.simpleflatmapper.csv.ParsingContext; import org.simpleflatmapper.csv.property.CustomReaderProperty; import org.simpleflatmapper.map.MapperBuildingException; import static org.junit.Assert.fail; public class FmmbGetterNotFoundTest { /* * When we are building an object with one argument constructor * we will try to find a getter that matches the constructor arg. */ public static class FooC { private final BarOneArgConst bar; public FooC(BarOneArgConst bar) { this.bar = bar; } } public static class BarOneArgConst { private final String val; public BarOneArgConst(String val) { this.val = val; } } public static class Crux { private final FooC foo; public Crux(FooC foo) { this.foo = foo; } public FooC getFoo() { return foo; } } @Test public void csvMapperExtrapolateGetterFromConstructor() { CsvMapperFactory.newInstance().newBuilder(FooC.class).addMapping("bar").mapper(); CsvMapperFactory.newInstance().newBuilder(Crux.class).addMapping("foo").mapper(); } /* * But that can't be done when there are no on arg constructor. */ public static class Foo2 { private final Bar2 bar; public Foo2(Bar2 bar) { this.bar = bar; } } public static class Bar2 { private final String val; private final int i; public Bar2(String val, int i) { this.val = val; this.i = i; } } @Test public void csvMapperGetterNotFound() { try { CsvMapperFactory.newInstance().newBuilder(Foo2.class).addMapping("bar").mapper(); fail(); } catch(MapperBuildingException e) { // expected } } /* * You then need to specify your own custom getter/reader */ @Test public void csvMapperCustomReader() { CsvMapperFactory .newInstance() .addColumnProperty("bar", new CustomReaderProperty(new CellValueReader<Bar2>() { @Override public Bar2 read(char[] chars, int offset, int length, ParsingContext parsingContext) { return new Bar2(new String(chars, offset, length), 2); } })) .newBuilder(Foo2.class) .addMapping("bar").mapper(); } }