我定义了以下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>>!
答案 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