首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中模拟单元测试的泛型参数?

如何在Java中模拟单元测试的泛型参数?
EN

Stack Overflow用户
提问于 2018-10-31 11:28:50
回答 3查看 3.6K关注 0票数 3

我有一个函数签名,我想模仿一个外部服务。

代码语言:javascript
运行
复制
public <T> void save(T item, AnotherClass anotherClassObject);

给定此函数签名和类名IGenericService,如何使用PowerMock来模拟它?还是莫基托?

对于这个泛型,我使用:类Theodore作为T item中的T。例如,我尝试使用:

代码语言:javascript
运行
复制
doNothing().when(iGenericServiceMock.save(any(Theodore.class),
                    any(AnotherClass.class));

IntelliJ曲柄如下:

代码语言:javascript
运行
复制
save(T, AnotherClass) cannot be applied to 
(org.Hamcrest.Matcher<Theodore>, org.Hamcrest.Matcher<AnotherClass>)

它列举了以下原因:

代码语言:javascript
运行
复制
reason: No instance(s) of type variable T exist 
so that Matcher<T> conforms to AnotherClass

首先,如果泛型参数处理得当,这个问题就应该解决。在这种情况下,你能做些什么呢?

更新: ETO分享如下:

代码语言:javascript
运行
复制
doNothing().when(mockedObject).methodToMock(argMatcher); 

同样的命运。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-31 12:17:46

您正在向when传递错误的参数。这可能有点令人困惑,但when方法有两种不同的用法(实际上是两种不同的方法):

  1. ( when(mockedObject.methodYouWantToMock(expectedParameter,orYourMatcher)).thenReturn(objectToReturn);
  2. ( doReturn(objectToReturn).when(mockedObject).methodYouWantToMock(expectedParameter,orYourMatcher);

注意:两种情况下都要注意when方法的输入参数。

在您的特殊情况下,您可以这样做:

代码语言:javascript
运行
复制
doReturn(null).when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));

这将解决您的编译问题。但是,使用org.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue在运行时测试将失败,因为您试图从void方法返回某些内容(null不是void)。你应该做的是:

代码语言:javascript
运行
复制
doNothing().when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));

稍后,您可以使用verify方法检查与模拟的交互。

更新:

检查你的进口品。您应该使用org.mockito.Matchers.any而不是org.hamcrest.Matchers.any

票数 4
EN

Stack Overflow用户

发布于 2018-10-31 11:37:24

尝试使用Mockito的ArgumentMatcher。在when中,也只提供了模拟的引用:

代码语言:javascript
运行
复制
doReturn(null).when(iGenericServiceMock).save(
    ArgumentMatchers.<Theodore>any(), ArgumentMatchers.any(AnotherClass.class));
票数 2
EN

Stack Overflow用户

发布于 2018-10-31 13:08:39

答案又快又棒!最后,我使用了以下代码来平滑它:

代码语言:javascript
运行
复制
doNothing().when(iGenericServiceMock).save(Mockito.any(), Mockito.any()); 

直到我使莫基托接受了任何方法后,Intellij才再次对此感到高兴。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53082310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档