package book.example.hamcrest; import org.hamcrest.Description; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; public class StringStartsWithMatcher extends TypeSafeMatcher<String> { private final String expectedPrefix; public StringStartsWithMatcher(String expectedPrefix) { this.expectedPrefix = expectedPrefix; } @Override protected boolean matchesSafely(String actual) { return actual.startsWith(expectedPrefix); } public void describeTo(Description matchDescription) { matchDescription.appendText("a string starting with ") .appendValue(expectedPrefix); } @Override protected void describeMismatchSafely(String actual, Description mismatchDescription) { String actualPrefix = actual.substring(0, Math.min(actual.length(), expectedPrefix.length())); mismatchDescription.appendText("started with ") .appendValue(actualPrefix); } public static Matcher<String> startsWith(String prefix) { return new StringStartsWithMatcher(prefix); } }