unit-testing - Kotlin Mockito NullPointerException
问题描述
有类:
@Singleton
class Exchange(
@Client("\${exchange.rest.url}") @Inject val httpClient: RxHttpClient
) : Exchange {
override suspend fun getSymbols(): List<String> {
val response = httpClient.retrieve(GET<String>("/someurl/symbols"), ExchangeInfo::class.java).awaitFirst()
return response.data
.map { it.symbol }.toList()
}
}
@Introspected
@JsonIgnoreProperties(ignoreUnknown = true)
class ExchangeInfo(
val data: List<Symbol>
)
@Introspected
@JsonIgnoreProperties(ignoreUnknown = true)
data class Symbol(
val symbol: String
)
我想测试这个功能getSymbols()
我正在写一个测试类:
import new.project.ExchangeInfo
import new.project.SpotSymbol
import io.micronaut.http.HttpRequest
import io.micronaut.http.client.RxHttpClient
import io.reactivex.Emitter
import io.reactivex.Flowable
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.reactive.awaitFirst
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import okhttp3.internal.immutableListOf
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mock
import org.mockito.kotlin.whenever
class ExchangeTest {
@Test
fun getSymbolsTest() = runBlocking {
//the answer I want to receive
val response: Flowable<ExchangeInfo> = Flowable.generate<ExchangeInfo, String>(
java.util.concurrent.Callable<String> { -> "symbol" },
io.reactivex.functions.BiConsumer<String, Emitter<ExchangeInfo>> { t1, t2 -> }
)
val httpClient = mock(RxHttpClient::class.java)
whenever(httpClient.retrieve(HttpRequest.GET<String>("/someurl/symbols"), ExchangeInfo::class.java))
.thenReturn(response)
val exchange = Exchange(httpClient)
//calling the tested method
val result = exchange.getSymbols()
assert(immutableListOf("symbol") == result)
}
}
运行测试时,我得到:
java.lang.NullPointerException: httpClient.retrieve (GET <… ExchangeInfo :: class.java) must not be null
你能告诉我如何正确模拟httpClient吗?
解决方案
有必要这样做:doReturn(Flowable.just(ExchangeInfo)).when(httpClient).retrieve(any<HttpRequest<String>>(), any<Class<Any>>())
推荐阅读
- android - 使用 image_editor_pro 发布失败错误
- hangouts-chat - 集成测试谷歌聊天机器人
- vba - 如何比较文件夹的最后修改日期是否与当前日期匹配?VBA
- javascript - 如何提高 Electron 应用中动画帧的频率?
- c# - 我在 ListView 中动态添加的图像显示为黑色方块,Windows 窗体
- ios - 当请求的属性丢失时,有没有办法解决 MPMediaItem.enumerateValues 崩溃?
- arrays - 如何将其他元素添加到数组[大小](已设置索引 0)
- javascript - /update_item/ 处的 JSONDecodeError 预期值:第 1 行第 1 列(字符 0)
- excel - 在 Excel 中编辑文本:在单元格中的每个单词前粘贴“-”
- matplotlib - 如何更改 matplotlib pcolor colobar 刻度字体大小?