android - 使用 Kotlin 在 JUnit 中进行 API 调用

标签 android junit kotlin rx-java2 dagger-2

我是自动测试的初学者,所以我想调用 API 来更新后端的一些数据,我想用 JUnit4 测试它。问题是当我想订阅时,他会抛出 NPE。

我的测试类看起来像:

class PhoneNumberPresenterTest {
    @Mock
    private val userService: UserService? = null

    val testScheduler = TestScheduler()

    val scheduler = TestSchedulerProvider(testScheduler)

@Before
    fun setup() {
//init stuffs
}
        @Test
    fun onContinueClicked_ResponseSuccess() {
        val phoneNumber = "(01234567890)"

        val genericResponse = GenericResponse<CheckApprovedStatusResponse>()
        genericResponse.data = CheckApprovedStatusResponse()

        `when`(userService!!.checkUserApprovedStatus(phoneNumber)).thenReturn(just(genericResponse))

        presenter!!.onContinueClicked(phoneNumber)

        testScheduler.triggerActions()
        ///stuffs
}

这是我在 Presenter 后端发布用户数据的地方

class PhoneNumberPresenter(private var mView: PhoneNumberContract.View,
                           private var scheduler: SchedulerProvider) : PhoneNumberContract.Handler {

 override fun onContinueClicked(enteredPhoneNumber: String) {
        mUserService.checkUserApprovedStatus(phoneNumber)
                .subscribeOn(scheduler.io())
                .observeOn(scheduler.ui())
                .subscribe({ response ->
                }, { error ->
                })
    }
}

更新

mUserService.checkUserApprovedStatus(phoneNumber) 为空

最佳答案

这里的想法很简单。你必须在你的演示者(或任何类)中提供一个调度程序:

interface YourSchedulerProvider {
    fun io(): Scheduler
    fun ui(): Scheduler
}

class YourPresenter
@Inject constructor(
        val scheduler: YourSchedulerProvider) {

   fun someFun() {
    mUserService.updateUser(id!!,accessToken!!,user)
            .subscribeOn(scheduler.io())
            .observeOn(scheduler.ui())
            .subscribe({ _ ->}, { _->})
   }

并在你的 Dagger 中提供 YourSchedulerProvider 的一些重要实现。

比在测试中只提供:

class YourTestSchedulerProvider(private val scheduler: Scheduler) : YourSchedulerProvider {

    override fun io(): Scheduler {
        return scheduler
    }

    override fun ui(): Scheduler {
        return scheduler
    }

    override fun computation(): Scheduler {
        return scheduler
    }
}

并在您的单元测试中使用它,例如:

val testScheduler = TestScheduler()
val scheduler = YourTestSchedulerProvider(testScheduler)
val presenter = YourPresenter(..., scheduler)

@Test
fun test() {
    (...)
    presenter.someFun()
    testScheduler.triggerActions()
}

关于android - 使用 Kotlin 在 JUnit 中进行 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49492875/

相关文章:

android - 如何在单击 "Search"菜单时更改操作栏背景?

java - 在 Android 中重复写入 XML 文件的最有效方法是什么?

generics - Kotlin 关于转换为泛型类

java - 将 CountDownTimer 取消功能转换为 RxJava

android - 电子/包裹 : Class not found when unmarshalling class with @Parcelize

java - Amazon 的 S3 可以按日期顺序返回对象摘要吗?

android - Android 中的 CTL(复杂文本语言)支持

java - 如何执行 Junit 测试?

java - 比较 JUnit 中的 2 个对象

java - 比较两个 Cursor 对象的相等性