【问题标题】:Can't mock final class in test using Mockito with Kotlin无法在使用 Mockito 和 Kotlin 的测试中模拟最终课程
【发布时间】:2019-08-17 12:17:00
【问题描述】:

我正在尝试运行一个简单的仪器测试:

class DefaultTest {

    private val networkHelper = Mockito.mock(NetworkHelperImpl::class.java)

    @Test fun inter() {
        given(networkHelper.isConnectedToNetwork()).willReturn(true)
        assertFalse { networkHelper.isConnectedToNetwork(false) }
    }
}

但我不能因为错误:

Mockito cannot mock/spy because :
- final class

如何避免?

正如本指南所说:

https://antonioleiva.com/mockito-2-kotlin/

我正在创建文件:

用这一行:

mock-maker-inline

但没有任何改变。

Gradle 很糟糕(我正在学习),但它必须有效。我也使用单元测试,所以现在我有:

//Tests
testImplementation 'junit:junit:4.13-beta-3'

testImplementation 'org.jetbrains.kotlin:kotlin-stdlib:1.3.41'
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit:1.3.41'

androidTestImplementation 'org.mockito:mockito-core:3.0.0'
androidTestImplementation 'org.mockito:mockito-android:2.24.5'
androidTestImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"

testImplementation 'org.amshove.kluent:kluent:1.14'

androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:rules:1.2.0'

【问题讨论】:

  • 我知道这不是一个答案——但对于 kotlin 模拟,我切换到 mockk.io 并且我没有回头。您可以模拟最终类,并且,如果您使用任何异步挂起功能,它会附带内置工具。为 kotlin 内置 kotlin。

标签: testing kotlin mockito


【解决方案1】:

简单添加

testImplementation("org.mockito:mockito-inline:2.8.47")

解决了这个问题。

【讨论】:

  • 感谢您的回答??
【解决方案2】:
  1. 按照以下步骤操作:https://antonioleiva.com/mockito-2-kotlin/
  2. 更新库并将androidTestImplementation 替换为testImplementation。就我而言:

    testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0 (更新)

    testImplementation 'org.mockito:mockito-core:3.0.0'(更新)

    testImplementation 'org.mockito:mockito-android:2.24.5'(将 androidTestImplementation 替换为 testImplementation)

  3. 从每个测试类中删除 MockitoAnnotations.initMocks(this)

使用 Android Studio 3.5 测试

【讨论】:

  • 这对我来说发生了一段时间,但就我而言,我没有 mockito-core 依赖项
  • 看起来只有本地测试的wotks(testImplementation),我使用了@Cristi Constantin的依赖项并且只在本地测试中工作。
【解决方案3】:

你试过mockito-kotlin吗? 将此添加到您的依赖项中:

testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"

【讨论】:

  • 我添加了,但没有任何改变。
  • 这里也一样,你能分享应用程序中包含的所有依赖项吗?
【解决方案4】:

我认为这里的问题是您正在编译 Mockito 仅用于 Instrumentation 测试 - androidTest 中的那些。但是,您希望根据放置 Mockito 扩展配置的位置为单元测试执行此操作。

当您使用androidTestImplementation 时,您正在编译该依赖项以进行仪器测试。使用testImplementation 将编译单元测试。替换:

androidTestImplementation 'org.mockito:mockito-core:3.0.0'
androidTestImplementation 'org.mockito:mockito-android:2.24.5'
androidTestImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"

与:

testImplementation 'org.mockito:mockito-core:3.0.0'
testImplementation 'org.mockito:mockito-android:2.24.5'
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0"

【讨论】:

    【解决方案5】:

    通过@RunWith(MockitoJUnitRunner::class) 注释您的测试类。所以你的课程看起来像这样:

    @RunWith(MockitoJUnitRunner::class)
    class DefaultTest {
    
        private val networkHelper = Mockito.mock(NetworkHelperImpl::class.java)
    
        @Test fun inter() {
            given(networkHelper.isConnectedToNetwork()).willReturn(true)
            assertFalse { networkHelper.isConnectedToNetwork(false) }
        }
    }
    

    对我来说,我所做的一切都和你一样,但失败了。我错过了那个注释部分。添加注释后,它按预期工作。

    【讨论】:

    • 但这里的对象是间谍或模拟。我们需要在哪里定义它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多