【问题标题】:How to use MockK to mock an observable如何使用 MockK 模拟 observable
【发布时间】:2018-09-27 20:33:27
【问题描述】:

我有一个数据提供者,它有一个 Observable<Int> 作为公共 API 的一部分。我正在测试的班级将其映射到Observable<String>

如何创建一个 mock,以便它可以在数据提供者的 observable 上发送不同的值?

我可以使用Fake 对象来做到这一点,但我认为 MockK 不需要做很多工作。

简化代码:

interface DataProvider {
    val numberData:Observable<Int>
}

class FakeDataProvider():DataProvider {

    private  val _numberData = BehaviorSubject.createDefault(0)
    override val  numberData = _numberData.hide()

    // Note: the internals of this class cause the _numberData changes.
    // I can use this method to fake the changes for this fake object,
    // but the real class doesn't have this method.

    fun fakeNewNumber( newNumber:Int ) {
        _numberData.onNext( newNumber )
    }
}

interface ClassUnderTest {
    val stringData:Observable<String>

}
class MyClassUnderTest( dataProvider: DataProvider ):ClassUnderTest {

    override val stringData = dataProvider.numberData.map { "string = " + it.toString() }
}

class MockKTests {

    @Test fun testUsingFakeDataProvider() {

        val fakeDataProvider        = FakeDataProvider()
        val classUnderTest          = MyClassUnderTest( fakeDataProvider )

        val stringDataTestObserver  = TestObserver<String>()

        classUnderTest.stringData.subscribe( stringDataTestObserver )

        fakeDataProvider.fakeNewNumber( 1 )
        fakeDataProvider.fakeNewNumber( 2 )
        fakeDataProvider.fakeNewNumber( 3 )

        // Note we are expecting the initial value of 0 to also come through
        stringDataTestObserver.assertValuesOnly( "string = 0", "string = 1","string = 2","string = 3" )
    }

    // How do you write the mock to trigger the dataProvider observable?
    @Test fun testUsingMockDataProvider() {
        val mockDataProvider        = mockk<DataProvider>()

//        every { ... what goes here ... } just Runs

        val classUnderTest          = MyClassUnderTest( mockDataProvider )

        val stringDataTestObserver  = TestObserver<String>()

        classUnderTest.stringData.subscribe( stringDataTestObserver )


        // Note we are expecting the initial value of 0 to also come through
        stringDataTestObserver.assertValuesOnly( "string = 0", "string = 1","string = 2","string = 3" )
    }
}

【问题讨论】:

    标签: rx-kotlin rx-kotlin2 mockk


    【解决方案1】:

    尝试使用以下内容:

    every { mockDataProvider.numberData } answers { Observable.range(1, 3) }

    也许你需要用另一种方式来制作一个模拟对象,像这样:

    val mockDataProvider = spyk(DataProvider())

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 2021-03-02
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多