gpt4 book ai didi

java - 如何使用mockito spy 重定向方法调用?

转载 作者:太空宇宙 更新时间:2023-11-04 06:30:49 25 4
gpt4 key购买 nike

我有一个依赖于“now”Date 对象的方法。

我想为它编写一个单元测试。

所以我想注入(inject)一个假固定的“现在”日期(使测试确定)。

我尝试过像这样注入(inject)一个 spy :

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!

你会如何编写我想要做的事情?

最佳答案

我认为你不需要 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 spy ,那么正如你所说,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));

但我认为这不是最好的方法。

关于java - 如何使用mockito spy 重定向方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26138436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com