@VisibleForTesting
  static List<String> sensitiveFields( Class clazz ) {
    Field[] declaredFields = clazz.getDeclaredFields();

    return concat( stream( declaredFields ), recurseDeep( declaredFields ) )
      .filter( field -> field.getAnnotation( Sensitive.class ) != null )
      .filter( field -> field.getAnnotation( Injection.class ) != null )
      .map( field -> field.getAnnotation( Injection.class ).name() )
      .collect( Collectors.toList() );
  }
@Test
  public void sensitiveFieldsCheckedAtMultipleLevels() {
    // verifies that fields below the top level can be correctly identified as Sensitive.
    class DeeperContainer {
      @Sensitive @Injection ( name = "Sensitive" ) String sensitive = "very sensitive";
      @Injection ( name = "NotSensitive" ) String notSensitive = "cold and unfeeling";
    }
    class DeepContainer {
      @InjectionDeep DeeperContainer deeperObj = new DeeperContainer();
    }
    Object topLevelObject = new Object() {
      @InjectionDeep DeepContainer deepObj = new DeepContainer();
    };
    List<String> sensitiveFields = StepMetaProps.sensitiveFields( topLevelObject.getClass() );

    assertThat( sensitiveFields, equalTo( singletonList( "Sensitive" ) ) );
  }