在Kotlin中模拟通用方法

时间:2018-10-08 11:11:54

标签: generics kotlin mockito overloading

我想编写一些涉及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类型吗?

1 个答案:

答案 0 :(得分:0)

回答原来的问题:

<块引用>

如何告诉 Kotlin 编译器 executeAsyncMethod() 的正确 T 类型

你可以在使用函数时给出类型参数。 例如,

whenever(mockClient.executeAsync<String>(...
...