2016-06-16 65 views
3

Groovy似乎搞亂了我的存根。以下測試通過:如何使用Groovy在Mockito中重載方法?

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 {} 
} 

然而,這一個失敗並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 {} 
} 

唯一的區別一個是用Java運行的,另一個是用Groovy運行的。

我該如何做到這一點,Mockito會成功在Groovy中存儲一個重載的方法?這是一個微不足道的例子,但我有一個需要測試的實際用例。

回答

3

好的我在發佈這個問題後就想出了它,即使我一整天都在爲這個而戰。

問題是,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 {} 
} 

我從這個類似的問題的答案:Mockito any matcher not working for doAnswer with overloaded method

+0

太好了!掙扎着這個問題也花了我整整一天,當時Mockito和Groovy升級到最新的主要版本。最終我發現了這個解決方案。非常感謝! – Windwalker

相關問題