模拟 mock<RestTemplate> getForObject 时如何解决歧义?
Posted
技术标签:
【中文标题】模拟 mock<RestTemplate> getForObject 时如何解决歧义?【英文标题】:How to resolve ambiguity when mocking mock<RestTemplate> getForObject? 【发布时间】:2022-01-18 16:25:44 【问题描述】:使用com.nhaarman.mockitokotlin2
测试restTemplate.getForObject(url, Int::class.java)
,url 是String!
的类型
试图模拟RestTemplate::getForObject
:
val restTemplate = mock<RestTemplate>
on getForObject(any(), any()) doReturn ResponseEntity.ok(Object())
但是得到一个错误:
Overload resolution ambiguity. All these functions match.
public open fun <T : Any!> getForObject(url: URI!, responseType: Class<TypeVariable(T)!>!): TypeVariable(T)! defined in org.springframework.web.client.RestTemplate
public open fun <T : Any!> getForObject(url: String!, responseType: Class<TypeVariable(T)!>!, vararg uriVariables: Any!): TypeVariable(T)! defined in org.springframework.web.client.RestTemplate
和
Type mismatch.
Required:
Unit
Found:
ResponseEntity<Object!>!
请帮忙,我是 Kotlin 的新手
【问题讨论】:
您能添加您要测试的代码吗?谢谢!restTemplate.getForObject(url, Int::class.java)
, url
是字符串类型!
【参考方案1】:
你需要告诉 Mockito 它应该期待 String
作为第一个参数。请尝试以下操作:
val restTemplate = mock<RestTemplate>
on getForObject(anyString(), eq(Int::class.java)) doReturn 200
您可以在reference documentation 中阅读有关anyString()
的更多信息。
【讨论】:
这里是any()
的问题:Not enough information to infer type variable T
我已经更新了我的答案,请查看;)
谢谢,但ResponseEntity.ok(Object())
有问题:Type mismatch. Required: Int! Found: ResponseEntity<Int!>!
更改为doReturn Int()
不起作用,原因是:Cannot access '<init>': it is private in 'Int'
错误
我的错。鉴于您希望 Int
成为您的 getForObject()
call 的响应,您需要在模拟呼叫时返回 Int
。请检查我的更新答案。以上是关于模拟 mock<RestTemplate> getForObject 时如何解决歧义?的主要内容,如果未能解决你的问题,请参考以下文章
Mock.Of<Object> VS Mock<Object>()
如何在 Java Spring boot 中模拟 RestTemplate?