如何模拟Void Call?

时间:2017-08-18 10:45:53

标签: java android unit-testing mockito retrofit

在我的api(使用Retrofit)中,我有很多这样的请求:

public Call<Void> postAsyncReserveDevice(@NonNull ReservedWorkerData data, @NonNull String token) {

        return apiService.postReservedWorker(
                data,
                ApiPrefs.TOKEN_PREFIX + token);
}

我忽略了回应的结果 - 他成功与否,这很重要。

但我在单元测试中遇到了问题。我需要嘲笑api的答案:

@Test
public void test() {
//...
when(apiService.postAsyncReserveDevice(
                eq(data), any(String.class)))
                .thenReturn(Calls.response(Any() as Void))
//...
}

看起来不错,但是当我运行测试用例时,我看到错误:

java.lang.ClassCastException: java.lang.Object cannot be cast to java.lang.Void

如何在我的api中模拟和测试这样的方法?

2 个答案:

答案 0 :(得分:0)

该方法返回Call<Void>,为什么不返回模拟方法:Mockito.any(Call.class)

例如:

Mockito.when(mock.postAsyncReserveDevice()).thenReturn(Mockito.any(Call.class));

虽然它会在编译时产生警告,因为它声明了原始Call

答案 1 :(得分:0)

我使用Kotlin使用的解决方案:

@Test
fun the_test() {
    val call: Call<Void> = Calls.response(makeVoid())
    `when`(apiManager.enablePushNotification(any())).thenReturn(call)
    ...
}

辅助功能:

private fun makeVoid(): Void? = null

仅此而已