gpt4 book ai didi

android - Mockito 不模拟存储库

转载 作者:行者123 更新时间:2023-11-28 21:16:15 25 4
gpt4 key购买 nike

我正在尝试使用 mockito 测试我的 ViewModel

这是我的测试类:

@RunWith(JUnit4::class)
class RatesViewModelTest {

@Rule @JvmField
open val instantExecutorRule = InstantTaskExecutorRule()

@Mock
var observer: Observer<Pair<ArrayList<CurrencyExchangerModel>,Boolean>>? = null

@Mock
private lateinit var repository: RatesRepository

private var currencyList = ArrayList<CurrencyModel>()

private lateinit var viewModel : RatesViewModel

@Before
fun setUp(){
MockitoAnnotations.initMocks(this)

currencyList.add(CurrencyModel("BASE"))
viewModel = RatesViewModel(repository!!)
viewModel.getCurrencyExchangerObservableList().observeForever(observer!!)
}

@Test
fun testNull(){
Mockito.`when`(repository.getFlowableRates()).thenReturn( Flowable.just(currencyList) )
assertTrue(viewModel.getCurrencyExchangerObservableList().hasObservers())

}
}

调用此方法时:

Mockito.`when`(repository.getFlowableRates()).thenReturn( Flowable.just(currencyList) )

我遇到了这个错误:

kotlin.UninitializedPropertyAccessException: lateinit property db has not been initialized

这里是存储库:

open class RatesRepository(context:Context) : BaseRepository(context){

@Inject
lateinit var ratesAPI: RatesAPI

@Inject
lateinit var db: Database

/**
* load the updated chatList from API
*/
fun loadCurrencyRatesFromAPI(): Single<ArrayList<CurrencyModel>> {
val supportedCurrency = context.resources.getStringArray(R.array.currencies)
return ratesAPI.getLatestRates(EUR_CURRENCY_ID).map { RatesConverter.getRatesListFromDTO(it,supportedCurrency) }
}

/**
* save rates on DB
*/
fun saveCurrencyRatesOnDB(list:ArrayList<CurrencyModel>): Completable {
return db.currencyRatesDAO().insertAll(list)
}

/**
* get flawable rates from DB
*/
fun getFlowableRates(): Flowable<List<CurrencyModel>> {
return db.currencyRatesDAO().getAll()
}

companion object {
const val EUR_CURRENCY_ID = "EUR" //BASE
}
}

我做错了什么?

谢谢!

最佳答案

当您定义 mock 的行为并使用 mockito 的 when(...).then(...) 符号时,
方法本身被调用(通过 mockito,通常与您的测试无关)。

在您的情况下,这是一个问题,因为 db 未初始化。

为避免此问题,请在这些情况下使用 doReturn(...).when(...) 语法,
这不会导致方法调用。

Mockito.doReturn(Flowable.just(currencyList)).when(repository).getFlowableRates();

(您可能需要调整此 java 语法以使其与 kotlin 兼容)

关于android - Mockito 不模拟存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57860340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com