我正在尝试使用 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/