2014-10-01 59 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