【发布时间】:2019-07-17 15:21:45
【问题描述】:
这是我的课堂测试:
private const val FAKE_STRING = "APP NAME"
@RunWith(MockitoJUnitRunner::class)
class UnitTestSample {
@Mock
private lateinit var mockContext: Context
@Test
fun readStringFromContext_LocalizedString() {
// Given a mocked Context injected into the object under test...
`when`(mockContext.getString(R.string.app_name))
.thenReturn(FAKE_STRING)
val myObjectUnderTest = ClassUnderTest(mockContext)
// ...when the string is returned from the object under test...
val result: String = myObjectUnderTest.getHelloWorldString()
// ...then the result should be the expected one.
assertThat(result, `is`(FAKE_STRING))
}
}
这是我的 gradle.build.kt (Kotlin DSL) 的一部分:
plugins {
id("com.android.application")
kotlin("android")
kotlin("kapt")
kotlin("android.extensions")
id("com.onesignal.androidsdk.onesignal-gradle-plugin")
jacoco
maven
}
dependencies {
...
//Test base
testImplementation("junit:junit:4.12")
testImplementation("org.junit.jupiter:junit-jupiter-api:5.0.3")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.0.3")
androidTestImplementation("androidx.test:runner:1.2.0")
androidTestImplementation("androidx.test.espresso:espresso-core:3.2.0")
//Unit Tests
testImplementation("org.mockito:mockito-core:3.0.0")
testImplementation("org.mockito:mockito-inline:3.0.0") //support for kotlin final classes
//Android UI Test
androidTestImplementation("org.robolectric:robolectric:3.7.1")
}
如您所见,Android Studio 无法识别 Mockito。我已经导入了org.mockito.junit.MockitoJUnitRunner
我正在运行这个示例单元测试
src/test/java/.../UnitTestSample.kt
你知道如何让它发挥作用吗?
编辑(解决方案):
我终于在 cmets 部分的帮助下让它工作了。问题是由插件部分的“maven”插件导入引起的,我没有看到这一点,因为我下载的用于将 Gradle 转换为 DSL Kotlin 的基础项目使这些插件正常工作。正如@MartinZeitler 所说,这不知何故导致 Mockito 在编译时不可用。根据@second,“Maven 的运行时不会转换为 gradle 的 runtimeOnly,而是编译”。
【问题讨论】:
-
你错过了
import org.mockito.junit.MockitoJUnitRunner。这可能是由于文件中的其他错误导致自动解析不起作用。或者你的 gradle 依赖项可能会丢失一些东西。 -
@dharms 我已经导入了它,但它无法识别,但在 import org.mockito.junit.MockitoJUnitRunner 中 mockito 是红色的
-
您使用 JUnit 4 还是 5 - 似乎您的导入是两者的混合?如果它是 5,您可能想尝试扩展。
-
@second 我使用 JUnit 5,JUnit 4 导入只是为了测试一些东西。当我设置 Jacoco 时,它要求我提供一个 TestEngine 来运行覆盖测试,所以我导入了一个 JUnit 5。但我认为完全没有问题。我可以同时删除它或使用 JUnit Vintage(它允许在 JUnit 4 和 3 上实现逆向兼容)。