package com.softwaremill.common.util; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; public class RichObjectTest { @Test public void shouldSetupField() { // given Object expected = Integer.valueOf("1"); // when MyObject actual = (MyObject) new RichObject(new MyObject(null, null)).set("myField", expected).unwrap(); // then assertEquals(expected, actual.getMyField()); } @Test public void shouldReturnFieldValue() { // given Object expected = Integer.valueOf("1"); // when Object actual = new RichObject(new MyObject(null, expected)).get("myField"); // then assertEquals(expected, actual); } @Test public void shouldSetupSuperField() { // given Object expected = Integer.valueOf("1"); // when MyObject actual = (MyObject) new RichObject(new MyObject(expected, null)).set("superField", expected).unwrap(); // then assertEquals(expected, actual.getSuperField()); } @Test public void shouldReturnSuperFieldValue() { // given Object expected = Integer.valueOf("1"); // when Object actual = new RichObject(new MyObject(expected, null)).get("superField"); // then assertEquals(expected, actual); } @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = "There are 2 with name 'superField' in this class hierarchy!") public void shouldComplainAboutDuplicatedFields() { // given Object value = Integer.valueOf("1"); Object secondValue = Integer.valueOf("2"); RichObject richObject = new RichObject(new MyObjectWithDuplicatedField(value, secondValue)); // when richObject.get("superField"); } } class MySuperObject { private Object superField; public MySuperObject(Object superField) { this.superField = superField; } public Object getSuperField() { return superField; } } class MyObject extends MySuperObject { private Object myField; public MyObject(Object superField, Object myField) { super(superField); this.myField = myField; } public Object getMyField() { return myField; } } class MyObjectWithDuplicatedField extends MySuperObject { private Object superField; public MyObjectWithDuplicatedField(Object superField, Object myField) { super(superField); this.superField = myField; } }