@Test
 public void shouldMatch() {
   writeFile(
       "A.java",
       "public class A {",
       "  public String testToString() {",
       "    Object obj = new Object();",
       "    return obj.toString();",
       "  }",
       "}");
   assertCompiles(methodInvocationMatches(true, Matchers.methodReturnsNonNull()));
 }
 @Test
 public void shouldNotMatchWhenMethodNameDiffers() {
   writeFile(
       "A.java",
       "public class A {",
       "  public String ToString() {",
       "    return \"match should be case sensitive\";",
       "  }",
       "  public String testMethodWithDifferentCase() {",
       "    return ToString();",
       "  }",
       "}");
   assertCompiles(methodInvocationMatches(false, Matchers.methodReturnsNonNull()));
 }
 @Test
 public void shouldMatchBareOverride() {
   writeFile(
       "A.java",
       "public class A {",
       "  public String toString() {",
       "    return \"a string\";",
       "  }",
       "  public String testToString() {",
       "    return toString();",
       "  }",
       "}");
   assertCompiles(methodInvocationMatches(true, Matchers.methodReturnsNonNull()));
 }
 @Test
 public void shouldMatchDescendants() {
   writeFile(
       "A.java",
       "public class A {",
       "  public String testThisToString() {",
       "    return toString();",
       "  }",
       "  public String testInstanceToString() {",
       "    Boolean b = new Boolean(true);",
       "    return b.toString();",
       "  }",
       "  public String testStringToString() {",
       "    String str = \"a string\";",
       "    return str.toString();",
       "  }",
       "}");
   assertCompiles(methodInvocationMatches(true, Matchers.methodReturnsNonNull()));
 }