gpt4 book ai didi

android - Kotlin + MockIto + Android 插桩测试

转载 作者:行者123 更新时间:2023-12-04 04:12:52 25 4
gpt4 key购买 nike

我正在尝试使用 Kotlin 在 Android 中使用 Mockito 运行 Instrumentation 测试 (androidTest)

  • 我的依赖项中有核心库。 'org.mockito:mockito-core:3.3.3'
  • 我的项目是用 Kotlin 编写的,所以我有 org.mockito:mockito-inline:3.3.3 来解决最后的类问题。
  • 因为我想在 Android 中运行模拟,所以我的依赖项中也有 org.mockito:mockito-android:3.3.3

但是在编译代码时出现以下错误

More than one file was found with OS independent path 'mockito-extensions/org.mockito.plugins.MockMaker'

这是重现问题的示例测试代码。将此测试作为 Instrumentation 测试运行。 (安卓测试)

主 Activity 测试

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations

class Calculator {
fun add(x: Int, y: Int): Int {
return x + y
}
}

@RunWith(AndroidJUnit4::class)
class MainActivityTest {

@Mock
lateinit var calculator: Calculator

@Before
fun before() {
MockitoAnnotations.initMocks(this)
}

@Test
fun test() {
`when`(calculator.add(10, 10)).thenReturn(20)
assertEquals(calculator.add(10, 10), 20)
}
}

app/build.gradle

plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}

android {
compileSdkVersion 29

defaultConfig {
applicationId "com.theapache64.mockitosample"
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}

testOptions {
unitTests.returnDefaultValues = true
}
}

dependencies {

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

testImplementation 'junit:junit:4.13'
androidTestImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'org.mockito:mockito-core:3.3.3'
androidTestImplementation 'org.mockito:mockito-android:3.3.3'
androidTestImplementation 'org.mockito:mockito-inline:3.3.3'
}

是否可以使用 KotlinMockito 运行 Android 仪器测试

注意:如果您认为这是一个重复的问题,我已经在整个互联网上进行了搜索。类似的堆栈跟踪还有其他问题,但我的情况不同。

任何帮助将不胜感激

最佳答案

我有同样的问题,我的解决方案是这个答案 https://stackoverflow.com/a/41594789/2286422 , - 即使用依赖于 Mockito 的 dexmaker 库。

删除其他 Mockito androidTestImplementation 依赖项,只添加以下一个(您可以找到最新版本 here ):

androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:2.28.1'

请注意,此解决方案仅适用于搭载 Android P 或更高版本 (official documentation) 的设备。

然后在实际测试中我按以下方式使用 Mockito:

@RunWith(MockitoJUnitRunner::class) // use Mockito runner to be able to use @Mock annotations
class MockitoTest {

@Mock
private lateinit var generalPref: GeneralPreferences

@Before
fun setup() {
// make setup
}

@After
@Throws(IOException::class) {
// make cleanup
}

@Test
fun testUser() {
val repo: UserLocalRepository =
UserLocalRepositoryImpl(generalPref) // generalPref is a mock
val user = repo.getUser()
Truth.assertThat(user).isNotNull()
}
}

关于android - Kotlin + MockIto + Android 插桩测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61421732/

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