Tester des membres private
Un des trucs compliqué quand on fait des tests unitaires c’est de tester les membres private. Une solution pour faire ça :
/** * Gets the field value from an instance. The field we wish to retrieve is * specified by passing the name. The value will be returned, even if the * field would have private or protected access. */ private Object getField( Object instance, String name ) throws Exception { Class c = instance.getClass(); // Retrieve the field with the specified name Field f = c.getDeclaredField( name ); // *MAGIC* make sure the field is accessible, even if it // would be private or protected f.setAccessible( true ); // Return the value of the field for the instance return f.get( instance ); }
Ensuite on mets dans le test :
public void testLengthAndCalled() throws Exception { Demo demo = new Demo(); // Retrieve the wasCalled field Boolean wasCalled = (Boolean) getField( demo, "wasCalled" ); // Should be false before calling assertFalse( wasCalled.booleanValue() ); // Call the private stringLength method Integer strlen = (Integer) executeMethod( demo, "stringLength", new Object[] { "four" } ); // The value returned should be '4' (length of the string 'four') assertEquals( 4, strlen.intValue() ); // Even though Boolean is a non-primitive and uses a reference, // it was a one-time object created with the actual primitive boolean // value of demo, so we must fetch it again wasCalled = (Boolean) getField( demo, "wasCalled" ); // THe method has now been called assertTrue( wasCalled.booleanValue() ); }