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中存根重载方法?这是一个简单的示例,但是我有一个实际的用例需要测试。
好的,我在发布此问题后马上就知道了这一点……即使我整天都在为此而战。
问题在于,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工作