2014-10-01 55 views
1

我有一個依賴於「now」Date對象的方法。如何使用mockito間諜來重定向方法調用?

我想爲它編寫一個單元測試。

所以我想注入一個假的固定「現在」日期(使測試確定)。

我試圖注入間諜這樣的:

private ImagesSorter setServerWithSpyImageSorter(User user, List imagesAsInsertionOrder, Date fakeNowDate) throws IOException { 
     ImagesSorter imagesSorter = spy(new ImagesSorter()); 
     when(imagesSorter.sortImages(imagesAsInsertionOrder, user)).thenReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)); 
     //doReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)).when(imagesSorter).sortImages(imagesAsInsertionOrder, user); 
     server = VenueServerImplBuilder.create().withImagesSorter(imagesSorter).build(); 
     server.init(); 
     return imagesSorter; 
    } 

,但它不工作。

1)當我使用doReturn(imagesSorter.sortIm..時,熱切地進行了評估。我不希望發生這種情況。我能避免這種情況嗎?

2)當我註釋掉doReturn(..和使用when(imagesSorter.sor

我得到了以下錯誤:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 



E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, you naughty developer! 

你會如何代碼我想幹什麼?

回答

0

我不認爲你需要Mockito來創建你的模擬。由於ImageSorter是一個具體的類,你不能做一個真正的裝飾,但你可以做這樣的:

public class FixedDateImageSorter extends ImagesSorter { 

    final Date fixedDdate; 

    FixedDateImageSorter(Date fixedDate) { 
     this.fixedDdate = fixedDate; 
    } 

    public List sortImages(List s, User u) { 
     return sortImages(s, u, fixedDdate); 
    } 
} 

然後

private ImagesSorter setServerWithSpyImageSorter(User user, List imagesAsInsertionOrder, Date fakeNowDate) throws IOException { 
    ImagesSorter imagesSorter = new FixedDateImageSorter(fakeNowDate); 
    server = VenueServerImplBuilder.create().withImagesSorter(imagesSorter).build(); 
    server.init(); 
    return imagesSorter; 
} 

如果你真的想要一個間諜的Mockito,那麼作爲你說doReturn是熱切評估。所以,你需要使用doAnswer到最近評估響應:

import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.spy; 
import static org.mockito.Mockito.doAnswer; 

... 

final Date fakeNowDate = new Date(); 
final ImagesSorter imagesSorter = spy(new ImagesSorter()); 

doAnswer(new Answer<List>() { 
    public List answer(InvocationOnMock invocation) throws Throwable { 
     // Get the actual arguments 
     List arg1 = (List) invocation.getArguments()[0]; 
     User arg2 = (User) invocation.getArguments()[1]; 
     // Then call the 3-args method using fakeNowDate 
     return imagesSorter.sortImages(arg1, arg2, fakeNowDate); 
    } 
}).when(imagesSorter).sortImages(any(List.class), any(User.class)); 

但我不認爲這是最好的辦法。

1

這句法不適用於間諜工作:

when(imagesSorter.sortImages(imagesAsInsertionOrder, user)).thenReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)); 

您需要使用此結構:

doReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)).when(imagesSorter).sortImages(imagesAsInsertionOrder, user)); 

下面是有關文件(見「關於間諜實物重要疑難雜症!」 ): http://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#13

+0

該鏈接是破碎的隊友。 – Ali 2017-08-24 00:25:14

+0

感謝您的支持,現在鏈接已更新 – luboskrnac 2017-08-24 10:14:28