改装HEAD必须在Kotlin中使用Void作为响应类型

时间:2018-10-11 17:38:51

标签: android kotlin retrofit

我定义了以下API方法:

@HEAD("test/{name})
fun checkTitle(@Path("name") name: String): Single<Response<Void>>

然后我要对该HEAD请求进行单元测试成功的响应,但无法弄清楚如何在Kotlin中实例化Void对象。

whenever(mockService.checkTitle(any()))
    .thenReturn(Single.just(Response.success(*VOID NEEDS TO BE HERE*)))

repo.checkTitle("tester")
    .test()
    .assertError(ValueTaken::class.java)

如果我将api调用响应更改为return Unit,则由于Retrofit不支持Unit,它在运行时因以下错误而崩溃。

  

HEAD方法必须使用Void作为响应类型。

编辑-到目前为止已尝试的类的添加

到目前为止,我已经尝试了以下方法,但是编译器抱怨说它期望返回类型为Single<Response<Void>>!

  • 单位
  • 没事
  • 任何

2 个答案:

答案 0 :(得分:0)

您可以通过(ab)使用反射来创建Void的实例:

val voidConstructor = Void::class.java.getDeclaredConstructors()[0]
voidConstructor.setAccessible(true)
val voidInstance = voidConstructor.newInstance()

这是在做什么:

  • 获取Void的第一个声明的构造函数,该构造函数是私有的
  • 将其设置为公开
  • 从该构造函数创建实例

虽然我不会在生产代码中建议这样做,但在测试中更可口。

答案 1 :(得分:0)

问题可能源于用task包装(是RxJava吗?),
因为it仅检查Single

!Void.class.equals(responseType)

因此,使用if (responseType == Response.class) { throw methodError(method, "Response must include generic type (e.g., Response<String>)"); } // TODO support Unit for Kotlin? if (requestFactory.httpMethod.equals("HEAD") && !Void.class.equals(responseType)) { throw methodError(method, "HEAD method must use Void as response type."); } Call<Void>(没有任何Response<Void>或其他ORM映射类)可能会更容易。有了ResponseBody就不会有@HEAD了,实例化ResponseBody对我来说似乎很奇怪(因为该数据类型定义很少用于传递和最终映射响应)。常规协同例程,例如。与Void一起使用可能会更好(因为不需要包装数据类型)。为了进行比较,在Java中这很简单:

suspend