【问题标题】:@MockK or mockk()@MockK 或 mockk()
【发布时间】:2021-04-20 18:37:55
【问题描述】:

在使用Mockk进行Android单元测试时,在声明依赖时使用符号有什么区别?

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)
    }
...
}

【问题讨论】:

  • 什么意思?性能差异,还是结果差异?
  • 任何@ChristianB,使用其中一个有什么不同吗?或者它们只是阅读相同内容的好方法?
  • 来自doc“它只是让创建模拟变得更简单”。因此,您可以使用 MockKAnnotations.init(this, relaxUnitFun = true) 放松所有模拟,而不是为每个模拟单独进行 mockk(relaxed = true)。

标签: android unit-testing mockk


【解决方案1】:

来自MockK project

不,这两种实现没有区别,它们是等价的。

一般来说,当您需要在代码中动态声明模拟时,您可以使用 mockk(),或者例如,如果您只需要一个模拟来放松其单元功能(在这种情况下,您可以使用模拟(relaxUnitFun = true)。

如果您的模拟具有所有相同的行为,您可以使用注释版本。

【讨论】:

    【解决方案2】:

    如果你的 TestClass 的依赖会改变,使用 Annotation 会更好。

    因为你只需要再添加/删除一个@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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-09
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多