【问题标题】:Mockito does'nt mock repositoryMockito 不模拟存储库
【发布时间】:2019-09-09 19:44:12
【问题描述】:

我正在尝试用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 属性 db 有 未初始化

这里是存储库:

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
    }
}

我做错了什么?

谢谢!

【问题讨论】:

    标签: android testing kotlin mockito viewmodel


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 2021-05-08
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多