当使用测试时,在声明依赖项时使用符号有什么不同吗?
class Test {
private val x: X = mockk()
private val test = TestClass(x)
...
}或
class Test {
@MockK
private lateinit var x: X
@InjectMockKs
private lateinit var test: TestClass
@Before
fun setup() {
MockKAnnotations.init(this)
}
...
}发布于 2021-02-01 13:58:56
来自MockK项目
不,这两种实现没有区别,它们是等价的。 一般来说,当您需要在代码中动态声明mockk()时,您可以使用mockk(),或者,例如,如果您需要一个模拟来放松其单元函数(在这种情况下,您需要使用mockk(relaxUnitFun = true)构建它。 如果您的模拟具有所有相同的行为,则可以使用注释版本。
发布于 2022-02-08 16:51:24
由于以下两个原因,我建议在测试中使用mockk()和“朴素”构造函数依赖项注入而不是注释:
mockk()构建器允许您使用val定义不可变变量,这是更安全、更高效和更好的*(就软件开发而言),而对于@Mockk,您应该使用var关键字;@InjectMockKs并没有看上去那么酷。我参与了一个项目,在这个项目中,我发现了与Mockito同样的问题。我的队友移除了构建器参数中间的一个类依赖项,构建并运行了代码,但忘记了在本地修复和运行测试。他推动了这些改变,但后来我们在“运行测试”管道阶段出现了一个错误,这个错误没有指向任何地方,只有NPE关于缺少类的错误。我们花了一些额外的时间终于找到了问题,问题是Mockito将尝试只通过构造函数注入、属性注入或setter注入按顺序注入模拟,如下所述。如果以下任何策略都失败了,那么Mockito 将不会报告失败;也就是说,您必须自己提供依赖关系。
https://www.javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/InjectMocks.html
发布于 2022-01-18 09:00:59
如果TestClass的依赖性要改变,那么使用注释更好。
因为您只需要再添加/删除一个@MockK,所以不需要关心目标类的构造函数。
原创
@ExtendWith(MockKExtension::class)
class Test {
@MockK
private lateinit var x: X
@InjectMockKs
private lateinit var test: TestClass
}为TestClass添加一个依赖项
@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
}https://stackoverflow.com/questions/65741072
复制相似问题