如何在android中使用dagger对kotlin文件进行UI测试?

如何在android中使用dagger对kotlin文件进行UI测试?,android,unit-testing,kotlin,mockito,ui-testing,Android,Unit Testing,Kotlin,Mockito,Ui Testing,下面是我的堆栈跟踪,我已经查看了所有的问题和答案,但找不到任何解决方案 java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:74) at

下面是我的堆栈跟踪,我已经查看了所有的问题和答案,但找不到任何解决方案

java.lang.IllegalStateException: Could not initialize plugin: interface 
org.mockito.plugins.MockMaker (alternate: null)
at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:74)
at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
at $Proxy6.isTypeMockable(Unknown Source)
at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.java:29)
at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:22)
at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:232)
at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.java:226)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:64)
at org.mockito.Mockito.mock(Mockito.java:1871)
at org.mockito.Mockito.mock(Mockito.java:1780)
at SplashActivityTest.init(SplashActivityTest.kt:126)
at java.lang.reflect.Method.invoke(Native Method) 
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lnet/bytebuddy/dynamic/loading/ClassInjector$UsingReflection;
at org.mockito.internal.creation.bytebuddy.SubclassInjectionLoader.<init>(SubclassInjectionLoader.java:28)
at org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker.<init>(SubclassByteBuddyMockMaker.java:33)
at org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker.<init>(ByteBuddyMockMaker.java:21)
at java.lang.Class.newInstance(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/data/app/com.test-Ceb6_iDz-8wl1a3HhgqEEg==/base.apk", zip file "/data/app/YwRi3yxfA1u5ckInmXjV-A==/base.apk"],nativeLibraryDirectories=[/data/app/test-Ceb6_iDz-8wl1a3HhgqEEg==/lib/x86, /data/app/YwRi3yxfA1u5ckInmXjV-A==/lib/x86, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
这个活动扩展了BaseActivity,它在下面的行中,因此在启动splash之后,我的测试失败,并且统计了lateinit var prefUtils尚未初始化,现在我使用了mocking,但仍然得到java.lang.IllegalStateException:无法初始化plugin:接口 org.mockito.plugins.MockMaker(可选:null)

我添加了如下依赖项:

testImplementation "junit:junit:$junitVersion"
testImplementation "org.mockito:mockito-core:$mockito"
testImplementation "org.mockito:mockito-inline:$mockito"
以下错误发生在我不嘲笑任何东西时

kotlin.UninitializedPropertyAccessException: lateinit property prefUtils has not been initialized
at BaseActivity.getPrefUtils(BaseActivity.kt:41)
at SplashActivity$onCreate$1.run(SplashActivity.kt:38)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Test running failed: Instrumentation run failed due to 'Process crashed.'
正如baseActivity所做的那样 @注入 lateinit变量prefUtils:prefUtils 因此,为了解决这个错误,我使用Mock

现在我也尝试过power mock,但在编译时失败了!!,它说

Unresolved reference: powermock
下线

@RunWith(PowerMockRunner::class)
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(SplashActivity::class.java)

在这里,SplashActivity继承了BaseActivity,所以每当测试运行时,注入的变量对于测试都保持未初始化状态,所以我通过在下面的行中进行更改找到了解决方案

@RunWith(PowerMockRunner::class)
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(SplashActivity::class.java)

下面是FakeLogInActivity::class.java的代码

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.sextpanther.sp.R

/**
* Used for testing fragments inside a fake activity.
*/
class FakeLogInActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
  }
}

现在测试运行成功,但只有使用snackbar view matcher和文本的测试失败。

但为什么要在UI测试中模拟某些内容?@rom4ek请参阅更新的问题,因为我不知道模拟是解决方案,但要使测试运行成功,应该做些什么!
@Rule
@JvmField
var mActivityTestRule = ActivityTestRule(FakeLogInActivity::class.java)
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.sextpanther.sp.R

/**
* Used for testing fragments inside a fake activity.
*/
class FakeLogInActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
  }
}