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