### Question:
PropertyList implements Serializable { public Object getPropertyValue(T object, String propertyName) throws IllegalArgumentException { assert propertyName != null : "propertyName must not be null"; assert object != null : "object must not be null"; if (!getAllAvailablePropertyNames().contains(propertyName)) { throw new IllegalArgumentException("Illegal property name: " + propertyName); } return metadata.getPropertyValue(object, propertyName); } PropertyList(ClassMetadata<T> metadata);  PropertyList(PropertyList<T> parentList); ClassMetadata<T> getClassMetadata(); PropertyList<T> getParentList(); void setSortProperty(String propertyName, String sortPropertyName); void addNestedProperty(String propertyName); boolean removeProperty(String propertyName); Set<String> getAllAvailablePropertyNames(); Set<String> getPropertyNames(); Set<String> getPersistentPropertyNames(); Map<String, String> getSortablePropertyMap(); Set<String> getNestedPropertyNames(); Class<?> getPropertyType(String propertyName); boolean isPropertyWritable(String propertyName); Object getPropertyValue(T object, String propertyName); void setPropertyValue(T object, String propertyName,
            Object propertyValue); PropertyKind getPropertyKind(String propertyName); boolean isPropertyLazyLoaded(String propertyName);  }### Answer:
@Test public void testGetPropertyValue_TransientProperty() { Person p = new Person(); p.setFirstName("Joe"); p.setLastName("Cool"); assertEquals("Joe Cool", propertyList.getPropertyValue(p, "fullName")); assertEquals("Joe Cool", childPropertyList.getPropertyValue(p, "fullName")); }
@Test public void testGetPropertyValue_PersistentProperty() { Person p = new Person(); p.setFirstName("Joe"); assertEquals("Joe", propertyList.getPropertyValue(p, "firstName")); assertEquals("Joe", childPropertyList.getPropertyValue(p, "firstName")); }
@Test public void testGetPropertyValue_Invalid() { Person p = new Person(); try { propertyList.getPropertyValue(p, "nonexistent"); fail("No exception thrown"); } catch (IllegalArgumentException e) { } try { propertyList.getPropertyValue(p, "address.street"); fail("No exception thrown"); } catch (IllegalArgumentException e) { } }