如何使用Groovy在Mockito中存根重载方法?

tyt*_*ytk 4 java groovy mockito

Groovy似乎弄乱了我的存根。以下测试通过:

MockitoStubTest2.java:

public class MockitoStubTest2 {
  @Test
  public void testStubbing() {
    MyInterface myInterface = mock(MyInterface.class);
    when(myInterface.someMethod(isA(MyClass.class))).thenReturn("foobar");
    assertEquals("foobar", myInterface.someMethod(new MyClass()));
  }

  private interface MyInterface {
    String someMethod(MyClass arg);
    String someMethod(String arg);
  }

  private static class MyClass {}
}
Run Code Online (Sandbox Code Playgroud)

但是,此失败并显示groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method ...#someMethod

MockitoStubTest3.groovy:

public class MockitoStubTest3 {
  @Test
  public void testStubbing() {
    MyInterface myInterface = mock(MyInterface.class);
    when(myInterface.someMethod(isA(MyClass.class))).thenReturn("foobar");
    assertEquals("foobar", myInterface.someMethod(new MyClass()));
  }

  private interface MyInterface {
    String someMethod(MyClass arg);
    String someMethod(String arg);
  }

  private static class MyClass {}
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,一个运行于Java,另一个运行于Groovy。

我怎样才能使Mockito成功在Groovy中存根重载方法?这是一个简单的示例,但是我有一个实际的用例需要测试。

tyt*_*ytk 6

好的,我在发布此问题后马上就知道了这一点……即使我整天都在为此而战。

问题在于,Mockito匹配器方法返回了,null但是Groovy由于某种原因搞砸了类型转换。因此,您需要手动进行类型转换,以便它找到正确的存根方法。以下作品:

MockitoStubTest3.groovy:

public class MockitoStubTest3 {
  @Test
  public void testStubbing() {
    MyInterface myInterface = mock(MyInterface.class);
    when(myInterface.someMethod(isA(MyClass.class) as MyClass)).thenReturn("foobar");
    assertEquals("foobar", myInterface.someMethod(new MyClass()));
  }

  private interface MyInterface {
    String someMethod(MyClass arg);
    String someMethod(String arg);
  }

  private static class MyClass {}
}
Run Code Online (Sandbox Code Playgroud)

我从类似的问题中得到了答案:Mockito任何匹配器都无法通过重载方法为doAnswer工作