标签: mockito-kotlin

Mockito 3.4.0 静态模拟异常

尝试模拟静态方法时出现以下异常。

对于SettingsUtility,当前线程中已经注册了静态mock,要创建新的mock,必须注销已有的静态mock注册

@Before
fun setUp() {
    mockStatic(SettingsUtility::class.java) {
        `when` { SettingsUtility.method(app) }.thenReturn { "" }}
}
Run Code Online (Sandbox Code Playgroud)

android mockito mockito-kotlin

12
推荐指数
4
解决办法
9468
查看次数

Mockito 无法模拟/间谍,因为:最后一课

我知道这个问题被问了很多次,但我遵循了很多答案,但仍然不起作用

如何用mockito模拟最后一堂课

在此链接中,他们说我们必须在 gradle 中添加:

testImplementation 'org.mockito:mockito-inline:2.13.0'
Run Code Online (Sandbox Code Playgroud)

=>目前我有

testImplementation "org.mockito:mockito-inline:2.28.2"
Run Code Online (Sandbox Code Playgroud)

我的 MockMaker 文件中也有这一行:

mock-maker-inline
Run Code Online (Sandbox Code Playgroud)

然后你可以看到我的以下代码:

object ApiHelper {

fun <T> createService(
        url: String,
        clazz: Class<T>
    ): T
}
Run Code Online (Sandbox Code Playgroud)

在我的 UITEST 中

    @Mock
    private lateinit var service: myService

    private lateinit var apiHelper: ApiHelper

    @Before
    fun setUp() {

        apiHelper = mock(ApiHelper::class.java)

        given(ApiHelper.createService(
            anyString(),
            MyService::class.java,
        )).willReturn(service)
    }
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题吗?我错过了什么吗?

android mockito kotlin mockito-kotlin

7
推荐指数
1
解决办法
3万
查看次数

如何使用 Mockito 用 lambda 模拟内联函数

使用 lambda 模拟内联函数时遇到问题。有课UserController,尝试tracer用函数来模拟createSpan

用户控制器类:

class UserController(private val tracer:Tracer) {
  fun subscribeUser() {
    tracer.createSpan("GraphDB: subscribedUser") {
       do something...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

createSpan内联函数:

inline fun <T> Tracer.createSpan(operationName: String, block: SpanContext.() -> T): T =
    buildSpan(operationName)
        .start()
        .useOn(this, block)
Run Code Online (Sandbox Code Playgroud)

尝试过:

 Mockito.`when`(mockTracer.createSpan<Any>(any(), any())).thenReturn(mockSpanContext)  
Run Code Online (Sandbox Code Playgroud)

回报org.mockito.exceptions.misusing.InvalidUseOfMatchersException

 Mockito.`when`(mockTracer.createSpan<SpanContext>("GraphDB: subscribedUser", any())).thenReturn(mockSpanContext)

Run Code Online (Sandbox Code Playgroud)

回报java.lang.NullPointerException

尝试了不同的方法,但仅返回org.mockito.exceptions.misusing.InvalidUseOfMatchersExceptionjava.lang.NullPointerException

我怎样才能用 lambda 模拟这个内联函数,或者只是忽略它,因为我不想测试这个函数?任何帮助表示赞赏。

junit unit-testing mockito kotlin mockito-kotlin

7
推荐指数
0
解决办法
1481
查看次数

如何将库添加到 testImplementation 和 androidTestImplementation

用于testandroid tests、单元测试和 UI 测试的 kotlin 库。

如果我将以下两行写为 build.gradle 的一部分,它就可以正常工作。

我的问题是,这是添加在测试和 Android 测试中使用的库的正确方法吗

构建.gradle

   androidTestImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
    testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
Run Code Online (Sandbox Code Playgroud)

感谢您提出的宝贵建议

谢谢R

android mockito build.gradle mockito-kotlin

6
推荐指数
1
解决办法
1358
查看次数

无法初始化 MockMaker

这是我的测试课:

class RocketListVMTest {

    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()

    private lateinit var sut: RocketListVM
    private var activeOnlyToggle = false

    private val repo: Repo = mock()

    @Before
    fun setUp() {
        sut = RocketListVM(repo)
        activeOnlyToggle = false
    }

    @Test
    fun toggleActiveOnlyWithTrueCallsRepository() {
        sut.toggleActiveOnly(true)

        verify(repo).getActiveOnlyLocalRockets()
    }
}
Run Code Online (Sandbox Code Playgroud)

具有以下依赖项:

androidTestImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.21.0'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
androidTestImplementation 'android.arch.core:core-testing:1.1.1'
Run Code Online (Sandbox Code Playgroud)

我已经src/androidTest/resources/mockito-extensions/org.mockito.plugins.MockMakermock-maker-inline里面创建了。

测试类失败,因为

java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
Caused by: java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker …
Run Code Online (Sandbox Code Playgroud)

android integration-testing android-testing mockito-kotlin

5
推荐指数
1
解决办法
2430
查看次数

Kotlin:如何验证模拟上调用了扩展函数

假设我有一个 Java 类 Metrics。我在 Kotlin 中定义了一些关于 Metrics 的扩展函数

fun Merics.expose(name: String, value: Number) {
 // do something
}
Run Code Online (Sandbox Code Playgroud)

请注意,Java 类Metrics也有一个名为的方法expose,但具有不同的签名。

我创建了一个测试,在其中模拟了一个对象并调用了应该调用metrics扩展函数的代码路径。expose但是我如何验证这些扩展函数是否被调用呢?

我尝试使用mockk和mockito-kotlin,它们似乎都不知道该metrics对象有一个用不同签名调用的新函数expose

kotlin mockk mockito-kotlin

4
推荐指数
1
解决办法
5199
查看次数

如何使用mock.io模拟内部构造的实例?

我正在mockk和Junit5中为FileUtility类的伴随对象中定义的静态方法编写单元测试用例。

方法如下,

class FileUtility {

    companion object {
        fun getFileObject(fileName: String): File {
            require(!StringUtils.isBlank(fileName)) { "Expecting a valid filePath" }
            val file = File(fileName)
            if (file.isHidden)
                throw llegalArgumentException()
            return file
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

单元测试用例如下,

@Test
fun `get file object test throws exception when file path is hidden`() {
    val filePath = "filepath"
    val file = mockk<File>()
    every { file.isHidden } returns true
    assertThrows(IllegalArgumentException::class.java) {
        getFileObject(filePath)
    }
    verify { file.isHidden}
}
Run Code Online (Sandbox Code Playgroud)

出现以下错误,

Expected java.lang.Exception to be thrown, but nothing was thrown. …
Run Code Online (Sandbox Code Playgroud)

unit-testing kotlin junit5 mockk mockito-kotlin

3
推荐指数
1
解决办法
1万
查看次数

如何创建 ArgumentMatchers.any(type: Class&lt;T&gt;) 以在 Kotlin 中进行测试?

我正在尝试对使用以下服务的类进行单元测试:

parserService.parseJsonStringToModel(json: String, adapterClass: Class<T>): T?
Run Code Online (Sandbox Code Playgroud)

我的第一个方法是用于ArgumentMatchers实现单元测试,如下所示:

Mockito.`when`(parserService.parseJsonStringToModel(ArgumentMatchers.any(), ArgumentMatchers.any<CreateAccountRequest>().javaClass)).thenReturn(null)
Run Code Online (Sandbox Code Playgroud)

由于在 Kotlin 中ArgumentMatchers.any()返回null,因此会生成NullPointerException不可为 null 的类型。所以我尝试使用Mockito-Kotlin库来避免这个问题。该方法如下所示:

whenever(parserService.parseJsonStringToModel(any(), any<CreateAccountRequest>().javaClass)).thenReturn(null)
Run Code Online (Sandbox Code Playgroud)

使用的库解决了第一个参数的问题,但仍然产生NullPointerException传递的第二个参数。

那么,如何创建ArgumentMatchersforClass<T>类型参数呢?

mockito kotlin mockito-kotlin

2
推荐指数
1
解决办法
1991
查看次数