I am working on a presentation about the ‘Single Responsibility Principle’, based on my previous post.
It take most of my time.
In the meantime, I want to share a sample code of how I use to test inner fields in my classes.
I am doing it for a special case of testing, which is more of an integration test.
In the standard unit testing of the dependent class, I am using mocks of the dependencies.
The Facts
- All of the fields (and dependencies in our classes are private
- The class do not have getters for its dependencies
- We wire things up using Spring (XML context)
- I wan to verify that dependency interface A is wired correctly to dependent class B
One approach would be to wire everything and then run some kind of integration test of the logic.
I don’t want to do this. It will make the test hard to maintain.
The other approach is to check wiring directly.
And for that I am using reflection.
Below is a sample code of the testing method, and the usage.
Notice how I am catching the exception and throws a RuntimeException in case there is a problem.
This way, I have cleaner tested code.
// Somewhere in a different utility class for testing | |
@SuppressWarnings("unchecked") | |
public static <T> T realObjectFromField(Class<?> clazz, String fieldName, Object object) { | |
Field declaredField = accessibleField(clazz, fieldName); | |
try { | |
return (T) declaredField.get(object); | |
} catch (IllegalArgumentException | IllegalAccessException e) { | |
throw new RuntimeException(e); | |
} | |
} | |
private static Field accessibleField(Class<?> clazz, String fieldName) { | |
try { | |
Field declaredField = clazz.getDeclaredField(fieldName); | |
declaredField.setAccessible(true); | |
return declaredField; | |
} catch (NoSuchFieldException | SecurityException e) { | |
throw new RuntimeException(e); | |
} | |
} | |
// This is how we use it in a test method | |
import static mypackage.ReflectionUtils.realObjectFromField; | |
ItemFiltersMapperByFlag mapper = realObjectFromField(ItemsFilterExecutor.class, "filtersMapper", filterExecutor); | |
assertNotNull("mapper is null. Check wiring", mapper); |