sách gpt4 ai đã đi

Lỗi kiểm thử đơn vị coroutine Kotlin: Ngoại lệ trong luồng "main @coroutine#1 @coroutine#2" java.lang.NullPointerException

In lại 作者:太空宇宙 更新时间:2023-11-03 10:58:47 26 4
mua khóa gpt4 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 = mutableListOf()

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

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

Phải 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()
}

@Bài kiểm tra
fun subscribeNotAuthenticatedShowSignInPanel() {
runBlocking {
val expectedResult = false
`when`(parseAuthController.isAuthenticated()).thenReturn(expectedResult)

presenter.subscribe()
}

verify(view).showSignInPanel()
}
}

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

1 Câu trả lời

问题解决了!

上面的代码其实是正确的。我有错误的 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
Bài viết được đề xuất: android - 嵌套的 RecyclerView 不回收
Bài viết được đề xuất: MySQL - 具有计算关系的 PHP SELECT 表
Bài viết được đề xuất: mysql - 为什么mysql说有语法错误?
Bài viết được đề xuất: android - 无法访问 Activity 绑定(bind) android
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com