2014-09-30 40 views
2

我正在使用mockito模擬。我的mockito模擬如何調用帶變更參數的原始方法?

我想控制方法foo(String a, Date b)

的調用來調用與foo(a, fixed_date)

原來的方法如何使用API​​的Mockito這樣做?

MyObject myObject = mock(MyObject.class); 

     when(myObject.foo(anyString, any(Date.class)) 
       .thenCallRealMethod(); 

爲什麼這不起作用?

它永遠不會將呼叫重定向

ImagesSorter imagesSorter = spy(new ImagesSorter()); 
     doReturn(imagesSorter.sortImages(images, user, fakeNowDate)).when(imagesSorter).sortImages(images,user); 
+0

有什麼方法'thenCallRealMethod()'執行?哪個類實現了這個方法? – 2014-09-30 13:32:08

+0

'thenCallRealMethod()'實際上是mockito API的一部分 – Benjamin 2014-09-30 13:38:56

+0

爲什麼你想這樣做?您的測試現在執行的代碼與部署時不同。你是否這樣做是因爲你的測試場景是爲特定的日期實例編寫的? – SteveD 2014-09-30 13:51:25

回答

1

我有一個解決方案,但它是一個有點哈克,讓我們假設的返回類型fooString

import static org.mockito.Mockito.when; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Matchers.any; 
import static org.mockito.Matchers.anyString; 

... 

final Date fixedDate = ...; 

MyClass myObject = mock(MyClass.class); 

when(myObject.foo(anyString(), any(Date.class))).thenAnswer(new Answer<String>() { 
     public String answer(InvocationOnMock invocation) throws Throwable { 
      // Switch the 2nd argument 
      invocation.getArguments()[1] = fixedDate; 
      // Then call the real method 
      return (String) invocation.callRealMethod(); 
     } 
    }); 

隨着MyClass是例如:

public class MyClass { 

    public String foo(String s, Date d) { 
     return s + d; 
    } 
} 

編輯:

在你與ImageSorter最後一個例子,我想你不需要的Mockito,簡單的裝飾會做的伎倆:

public interface ImageSorter { 
    void sortImages(Images images, User user); 

    void sortImages(Images images, User user, Date date); 
} 

public class ImageSorterDecorator implements ImageSorter { 

    final ImageSorter delegate; 
    final Date fixedDate; 

    public ImageSorterDecorator (ImageSorter delegate, Date fixedDate){ 
     this.delegate = delegate; 
     this.fixedDate = fixedDate; 
    } 

    public void sortImages(Images images, User user){ 
     delegate.sortImages(images, user, fixedDate); 
    } 

    public void sortImages(Images images, User user, Date date){ 
     delegate.sortImages(images, user, fixedDate); 
    } 
} 
+0

它如何處理mockito語法? – 2014-10-01 07:50:16

+0

你是什麼意思?它使用mockito API,我使用的版本是1.9.5 – Benjamin 2014-10-01 07:58:06

+0

對不起,在any(Date.class)'之後缺少右括號。我修好了它 – Benjamin 2014-10-01 08:09:49

相關問題