我想编写一些涉及JDKHttpClient
from ScribeJava的测试,因为我想模拟我用来对API进行自动测试的OAuth服务。
模拟execute
方法可以正常工作:
val mockClient : HttpClient = mock(JDKHttpClient::class.java)
val responseBody = "{\"access_token\": \"gotit\", \"token_type\": \"type\", \"expires_in\": 3600}"
whenever(mockClient.execute(anyString(), anyMap(), eq(Verb.GET), anyString(), any(ByteArray::class.java)))
.thenReturn(Response(302, "ciao", emptyMap(), responseBody))
仅模拟execute
方法时,由于客户端尝试调用executeAsync
变体,因此在尝试获取访问令牌时会收到NPE。我的问题是我不知道如何模拟那些方法。显而易见的事情是:
whenever(mockClient.executeAsync(anyString(), anyMap<String,String>(), eq(Verb.GET), anyString(),
any(String::class.java),
any(OAuthAsyncRequestCallback::class.java),
any(OAuthRequest.ResponseConverter::class.java))
).thenReturn(JDKHttpFuture(Response(302, "ciao", emptyMap(), responseBody)))
问题是Kotlin编译器无法为这些方法的签名推断类型T
:
public <T> Future<T> executeAsync(String userAgent, Map<String, String> headers, Verb httpVerb, String completeUrl,
byte[] bodyContents,
OAuthAsyncRequestCallback<T> callback,
OAuthRequest.ResponseConverter<T> converter)
如何告诉Kotlin编译器正确的T
类型?
是否存在以下语法变体:
any(OAuthRequest.ResponseConverter::class.java)
可以让我直接设置与T
关联的ResponseConverter
类型吗?
答案 0 :(得分:0)
回答原来的问题:
<块引用>如何告诉 Kotlin 编译器 executeAsyncMethod()
的正确 T 类型
你可以在使用函数时给出类型参数。 例如,
whenever(mockClient.executeAsync<String>(...
...