首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@MockK或mockk()

@MockK或mockk()
EN

Stack Overflow用户
提问于 2021-01-15 17:47:04
回答 3查看 1.1K关注 0票数 3

当使用测试时,在声明依赖项时使用符号有什么不同吗?

代码语言:javascript
复制
class Test {
    private val x: X = mockk()

    private val test = TestClass(x)
...
}

代码语言:javascript
复制
class Test {
    @MockK
    private lateinit var x: X

    @InjectMockKs
    private lateinit var test: TestClass
    
    @Before
    fun setup() {
        MockKAnnotations.init(this)
    }
...
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-01 13:58:56

来自MockK项目

不,这两种实现没有区别,它们是等价的。 一般来说,当您需要在代码中动态声明mockk()时,您可以使用mockk(),或者,例如,如果您需要一个模拟来放松其单元函数(在这种情况下,您需要使用mockk(relaxUnitFun = true)构建它。 如果您的模拟具有所有相同的行为,则可以使用注释版本。

票数 5
EN

Stack Overflow用户

发布于 2022-02-08 16:51:24

由于以下两个原因,我建议在测试中使用mockk()和“朴素”构造函数依赖项注入而不是注释:

  1. mockk()构建器允许您使用val定义不可变变量,这是更安全、更高效和更好的*(就软件开发而言),而对于@Mockk,您应该使用var关键字;
  2. @InjectMockKs并没有看上去那么酷。我参与了一个项目,在这个项目中,我发现了与Mockito同样的问题。我的队友移除了构建器参数中间的一个类依赖项,构建并运行了代码,但忘记了在本地修复和运行测试。他推动了这些改变,但后来我们在“运行测试”管道阶段出现了一个错误,这个错误没有指向任何地方,只有NPE关于缺少类的错误。我们花了一些额外的时间终于找到了问题,问题是

Mockito将尝试只通过构造函数注入、属性注入或setter注入按顺序注入模拟,如下所述。如果以下任何策略都失败了,那么Mockito 将不会报告失败;也就是说,您必须自己提供依赖关系。

https://www.javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/InjectMocks.html

票数 3
EN

Stack Overflow用户

发布于 2022-01-18 09:00:59

如果TestClass的依赖性要改变,那么使用注释更好。

因为您只需要再添加/删除一个@MockK,所以不需要关心目标类的构造函数。

原创

代码语言:javascript
复制
@ExtendWith(MockKExtension::class)
class Test {
    @MockK
    private lateinit var x: X

    @InjectMockKs
    private lateinit var test: TestClass
}

TestClass添加一个依赖项

代码语言:javascript
复制
@ExtendWith(MockKExtension::class)
class Test {
    @MockK
    private lateinit var x: X

    @MockK
    private lateinit var y: Y  // <1> Just add this

    @InjectMockKs
    private lateinit var test: TestClass  // <2> Don't need to add the changed dependency into it's constructor
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65741072

复制
相关文章

相似问题

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