gpt4 book ai didi

android - Kotlin 协程单元测试错误 : Exception in thread "main @coroutine#1 @coroutine#2" java. lang.NullPointerException

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:47 26 4
gpt4 key购买 nike

我正在尝试对我使用 Kotlin 协程制作的 Presenter 进行单元测试,这也是我第一次使用 Mockito

每当我尝试运行单元测试时,它在协程中第一次尝试对我的 View 执行任何操作时都会收到以下错误

Exception in thread "main @coroutine#1 @coroutine#2" java.lang.NullPointerException
at .signin.SignInPresenter$subscribe$1.doResume(SignInPresenter.kt:45)
at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:54)
at kotlinx.coroutines.experimental.DispatchedKt.resumeCancellable(Dispatched.kt:208)
at kotlinx.coroutines.experimental.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:35)
at kotlinx.coroutines.experimental.CoroutineStart.invoke(CoroutineStart.kt:111)
at kotlinx.coroutines.experimental.AbstractCoroutine.start(AbstractCoroutine.kt:161)
at kotlinx.coroutines.experimental.BuildersKt.launch(Builders.kt:68)
at kotlinx.coroutines.experimental.BuildersKt.launch$default(Builders.kt:61)
at .signin.SignInPresenter.subscribe(SignInPresenter.kt:42)

这是我的演示者的相关部分,错误中引用的行是 view.showSigninPanel

class SignInPresenter(
private val view: SignInContract.View,
private val userRepo: ParseAuthController,
private val contextPool: CoroutineContextProvider
) : SignInContract.Presenter {

private val coroutineJobs: MutableList<Job> = mutableListOf()

override fun subscribe() {
view.loadBackgroundImage()
view.setUpSignInPanel()
view.setUpKeyboardListener()

coroutineJobs.add(launch(contextPool.Main) {
if (!userRepo.isAuthenticated()) {
view.showSignInPanel()
subscribeToLoginValidation()
subscribeToPaswordEmailValidation()
} else {
view.launchMainActivity()
}
})
}

userRepo.isAuthenticated() 的调用是挂起的调用

我正在按照这篇文章将测试协程上下文传递到我的演示者中

https://android.jlelse.eu/mastering-coroutines-android-unit-tests-8bc0d082bf15

class TestContextProvider : CoroutineContextProvider() {
override val Main: CoroutineContext = Unconfined
override val IO: CoroutineContext = Unconfined
}

这是我目前的单元测试

class SignInPresenterTest {

private lateinit var view: SignInContract.View
private lateinit var presenter: SignInPresenter
private lateinit var parseAuthController: ParseAuthController

@Before
fun setUp() {
view = mock(SignInContract.View::class.java)

parseAuthController = mock(ParseAuthController::class.java)

presenter = SignInPresenter(
view,
parseAuthController,
TestContextProvider()
)
}

@After
fun tearDown() {
presenter.dispose()
}

@Test
fun subscribeNotAuthenticatedShowSignInPanel() {
runBlocking {
val expectedResult = false
`when`(parseAuthController.isAuthenticated()).thenReturn(expectedResult)

presenter.subscribe()
}

verify(view).showSignInPanel()
}
}

更新:我一直在做一些额外的测试,看起来如果我删除我的演示者中的挂起调用 if (!userRepo.isAuthenticated()) 它不会崩溃而且我可以验证 Mockito 是否运行了某些东西,但这不是一个实际的解决方案......但是带有暂停调用的东西导致了问题?

最佳答案

问题解决了!

上面的代码其实是正确的。我有错误的 Mockito 依赖。

我正在从一个同事的仓库中复制一些依赖项,他们正在使用这个提供一些 Kotlin 特定功能的库

https://github.com/nhaarman/mockito-kotlin

要么有什么东西破坏了对协程的支持,要么有一些不同的要求才能让它工作?

更新到最新的 Mockito 依赖项。

关于android - Kotlin 协程单元测试错误 : Exception in thread "main @coroutine#1 @coroutine#2" java. lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50184175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com