【问题标题】:Make a API call in JUnit with Kotlin使用 Kotlin 在 JUnit 中进行 API 调用
【发布时间】:2018-03-26 13:38:27
【问题描述】:

我是自动测试的初学者,所以我想调用 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) 为空

【问题讨论】:

    标签: android junit kotlin rx-java2 dagger-2


    【解决方案1】:

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

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

    【讨论】:

    • " .subscribeOn(scheduler.io())" 给我 nullPointerException。你知道为什么吗?
    • 我猜调度器是空的。检查它是否在您的演示者内部正确注入
    • 它不为空,但大小、计数器、时间为 0。可能是这个问题吗?
    • 很抱歉,这里无法给您任何答复。我不知道你在写什么样的“大小、计数器、时间”。但是,如果您 100% 确定 NPE 来自该特定行,则可能是由于您正在调用 .subsctibeOn 的 null 调度程序或 null observable。并且此错误可能与此建议的解决方案无关。而是实施问题
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2015-07-26
    相关资源
    最近更新 更多