public static <T> VerboseCondition<T> verboseCondition(Predicate<T> predicate, String description,
                                                         Function<T, String> objectUnderTestDescriptor) {
    return new VerboseCondition<>(predicate, description, objectUnderTestDescriptor);
  }
@Test
  public void should_fail_and_display_actual_description_as_per_transformation_function_with_hasCondition() {
    // GIVEN
    Condition<String> shortLength = verboseCondition(actual -> actual.length() < 4,
                                                     "length shorter than 4",
                                                     s -> format(" but length was %s", s.length(), s));
    // WHEN
    AssertionError assertionError = expectAssertionError(() -> assertThat("foooo").has(shortLength));
    // THEN
    then(assertionError).hasMessage(format("%nExpecting actual:%n" +
                                           "  \"foooo\"%n" +
                                           "to have length shorter than 4 but length was 5"));
  }