首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InjectMocks不使用带有默认值的Kotlin构造函数参数

InjectMocks不使用带有默认值的Kotlin构造函数参数
EN

Stack Overflow用户
提问于 2021-08-26 05:53:49
回答 1查看 761关注 0票数 1

编辑:我用mockito-kotlin 这里创建了一张票证

我有一个定义如下的类:

代码语言:javascript
复制
package me.jpalacios.poc

class MyClass(
    private val myDependency: MyDependency = MyDependency()
) {
    fun run() {
        myDependency.doSomething()
    }
}
代码语言:javascript
复制
package me.jpalacios.poc

class MyDependency {

    fun doSomething() {
        println("I did something")
    }
}
代码语言:javascript
复制
package me.jpalacios.poc

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.InjectMocks
import org.mockito.Mock
import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.kotlin.verify

@ExtendWith(MockitoExtension::class)
class MyClassTest {

    @Mock
    private lateinit var myDependency: MyDependency
    @InjectMocks
    private lateinit var myClass: MyClass

    @Test
    fun `Test InjectMocks`() {
        myClass.run()

        verify(myDependency).doSomething()
    }
}

看起来像这样定义的测试不起作用,因为模拟没有注入:

代码语言:javascript
复制
@ExtendWith(MockitoExtension::class)
class MyClassTest {
    @Mock
    private lateinit var dependency: MyDependency
    @InjectMocks
    private lateinit var underTest: MyClass
}
代码语言:javascript
复制
plugins {
    kotlin("jvm") version "1.5.20"
}

group = "me.jpalacios"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib"))

    testImplementation("org.junit.jupiter:junit-jupiter:5.7.2")
    testImplementation("org.junit.jupiter:junit-jupiter-params:5.7.2")
    testImplementation("org.assertj:assertj-core:3.20.2")
    testImplementation("org.mockito.kotlin:mockito-kotlin:3.2.0")
    testImplementation("org.mockito:mockito-junit-jupiter:3.11.2")
}

tasks{
    jar {
        duplicatesStrategy = DuplicatesStrategy.EXCLUDE

        configurations["compileClasspath"].forEach { file: File ->
            from(zipTree(file.absoluteFile))
        }
    }
    compileKotlin {
        kotlinOptions {
            jvmTarget = "${JavaVersion.VERSION_11}"
        }
    }
    test {
        useJUnitPlatform()
    }
}

对原因有什么想法吗?

产出如下:

我做了些事 想要但没有被调用: me.jpalacios.poc.MyDependency.doSomething(MyDependency.kt:6)的myDependency.doSomething();->实际上,与这个模拟没有任何交互。 想要但没有被调用: me.jpalacios.poc.MyDependency.doSomething(MyDependency.kt:6)的myDependency.doSomething();->实际上,与这个模拟没有任何交互。 me.jpalacios.poc.MyDependency.doSomething(MyDependency.kt:6) at me.jpalacios.poc.MyClassTest.Test InjectMocks(MyClassTest.kt:22) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)在java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) .

EN

回答 1

Stack Overflow用户

发布于 2021-08-26 08:52:41

我真的不是Mockito方面的专家,但是为构造函数参数添加默认值实际上是说不需要传递依赖项,所以如果Mockito在本例中不尝试注入模拟,我不会感到惊讶。它确实看到了一个无arg构造函数可用,所以您不希望它使用它吗?

无论如何,我都不确定你是否需要这个。为什么不自己实例化被测试的类,并将它传递给您需要的模拟呢?

代码语言:javascript
复制
@ExtendWith(MockitoExtension::class)
class MyClassTest {

    @Mock
    private lateinit var myDependency: MyDependency

    @Test
    fun `Test InjectMocks`() {
        MyClass(myDependency).run()

        verify(myDependency).doSomething()
    }
}

如果您需要在多个测试之间共享这样的初始化,则可以使用惰性属性或@BeforeTest方法来创建它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68933185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档