无法在Android Espresso UI测试中使用MockK

3

在尝试使用MockK进行UI测试时,我遇到了错误,而在单元测试中它是完美工作的。

MockK could not self-attach a jvmti agent to the current VM

完整的错误报告

Caused by: io.mockk.proxy.MockKAgentException: MockK could not self-attach a jvmti agent to the current VM. This feature is required for inline mocking.
This error occured due to an I/O error during the creation of this agent: java.io.IOException: Unable to dlopen libmockkjvmtiagent.so: dlopen failed: library "libmockkjvmtiagent.so" not found

Potentially, the current VM does not support the jvmti API correctly
at io.mockk.proxy.android.AndroidMockKAgentFactory.init(AndroidMockKAgentFactory.kt:67)
at io.mockk.impl.JvmMockKGateway.<init>(JvmMockKGateway.kt:46)
at io.mockk.impl.JvmMockKGateway.<clinit>(JvmMockKGateway.kt:186)
... 30 more
Caused by: java.io.IOException: Unable to dlopen libmockkjvmtiagent.so: dlopen failed: library "libmockkjvmtiagent.so" not found
at dalvik.system.VMDebug.nativeAttachAgent(Native Method)
at dalvik.system.VMDebug.attachAgent(VMDebug.java:693)
at android.os.Debug.attachJvmtiAgent(Debug.java:2617)
at io.mockk.proxy.android.JvmtiAgent.<init>(JvmtiAgent.kt:48)
at io.mockk.proxy.android.AndroidMockKAgentFactory.init(AndroidMockKAgentFactory.kt:40)

请问有没有其他初始化MockK并在Espresso中使用的方法?

当尝试添加:

androidTestImplementation "org.mockito:mockito-inline:$mockitoVersion"

我发现了这个错误。
找到了两个路径为'mockito-extensions/org.mockito.plugins.MockMaker'的文件。添加一个packagingOptions块可能会有所帮助,请参考https://developer.android.com/reference/tools/gradle-api/7.2/com/android/build/api/dsl/ResourcesPackagingOptions获取更多信息。 版本信息
mockk version = 1.12.4
Android = 32
kotlin_version = '1.6.21'

以下是在Android UI测试用例(Espresso)中添加时导致此问题的代码

val presenter = mockk<LoginPresenter>()

val view = mockk<LoginView>()

如何执行类似这样的模拟API调用。
val presenter = mockk<LoginPresenter>()
    val view = mockk<LoginView>()


onView(withId(R.id.button_login)).perform(loginClick())

但我希望在perform()中调用 mock api 而不是 loginClick(),是否可以通过以下方式调用执行以便我的应用程序使用 mock api,或者有没有办法使我的整个测试用例文件使用 mock 数据。

every { presenter.onLoginButtonClicked("bc@mail.com","Abc123")  } returns  view.onCognitoLoginSuccess()

你使用的是哪些版本的 Mockk、Android 和 Kotlin?你能否提供一些能够复现问题的代码? - aSemy
@aSemy,帖子中有更新版本。 - RockyGlobal
你能试试MockK 1.12.5吗?如果不行,你能否提一个问题(issue)?https://github.com/mockk/mockk/issues/new - aSemy
嗨,我尝试了MockK 1.12.5,这个错误没有再现,谢谢。我在帖子中更新了一个查询。 - RockyGlobal
@aSemy 如何在 Espresso UI 测试中初始化 MockK - RockyGlobal
2个回答

14
对我来说,添加这个解决了问题:
android {
  testOptions {
    packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
    }
  }
}

我在这里找到了这个。希望能有所帮助。

这对我起作用。这应该是被接受的答案。 - subair_a

3
根据这里的说法:

由于mockk1.12.4存在问题,导致仪器化的Android测试全部失败。

我使用了io.mockk:mockk-android:1.12.4,也遇到了同样的问题。

解决方案: 我将io.mockk:mockk-android的版本更改为1.12.3,测试成功运行。

androidTestImplementation "io.mockk:mockk-android:1.12.3"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接