Android 使用Kotlin在JUnit中进行API调用

Android 使用Kotlin在JUnit中进行API调用,android,junit,kotlin,rx-java2,dagger-2,Android,Junit,Kotlin,Rx Java2,Dagger 2,我是自动测试的初学者,所以我想做一个API调用来更新后端的一些数据,我想用JUnit4进行测试。问题是当我想订阅时,他会抛出NPE 我的测试类看起来像: class PhoneNumberPresenterTest { @Mock private val userService: UserService? = null val testScheduler = TestScheduler() val scheduler = TestSchedulerProvid

我是自动测试的初学者,所以我想做一个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
}
更新


mUserService.checkUserApprovedStatus(电话号码)为空

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

在您的匕首中,只需提供SchedulerProvider的一些重要实现

而在测试中仅提供:

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。你知道为什么吗?我猜调度程序是空的。检查它是否正确地注入到Presenterrit的内部。它不为null,但大小、计数器、时间为0。这可能是个问题吗?很抱歉,这里不可能给你任何答案。我不知道你在写什么样的“尺寸、计数器、时间”。但是,如果您100%确定NPE来自该特定行,那么这可能是由于您正在调用的空调度程序或空可观测值。这个错误可能与建议的解决方案无关。这相当于执行问题
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()
}