【问题标题】:How to achive @Capturing like behavior in MockK?如何在 MockK 中实现类似 @Capturing 的行为?
【发布时间】:2018-09-01 21:09:03
【问题描述】:

我们使用 JMockit 模拟框架对 Spring 应用程序进行了单元测试。现在我们想使用 MockK 在 Kotlin 中编写新的测试。几乎一切似乎都运行良好,但我们无法弄清楚如何模拟 Spring 自动装配的 bean。使用 JMockit,我们曾经使用 @Capturing 注释来扩展模拟,也用于实现模拟接口的类。如何在 MockK 框架中实现模拟的类似行为?

【问题讨论】:

  • 我认为基本答案并不像使用一个注释那么简单,但首先我想大致了解问题所在。没有与 JMockit 相比。你想要 Autowire 模拟,对吗?为什么你不做@Bean fun bean(): Type = mockk() 我知道在 mockk 中对 Spring 的支持是有限的,但只是想了解痛点和用例。
  • 非常感谢,您说的对,确实可以按照您建议的方式进行。结合轻松的模拟,我能够让它发挥作用。顺便说一句,有没有办法将轻松模拟的默认值设置为 null 而不是默认值?
  • 没有,但您可以通过 GH issues 请求功能

标签: spring jmockit mockk


【解决方案1】:

将 oleksiyp cmets 带入答案


目前,Mockk 没有这种行为。它对 Spring 的支持是有限的,但是有一个使用 Spring 本身的解决方法:

您可以根据需要创建bean,即使在集成测试中也是如此。创建 bean 时,可以实例化一个 mock:

@Bean
fun bean(): BeanType = mockk()

然后,当这个 bean 被自动装配时,它将返回模拟的实例,并且您将能够像往常一样使用 Mockk 的 DSL 设置它的行为。

【讨论】:

  • 这似乎不再起作用(如果它曾经起作用)。我在 spring-boot-2.3.11 和 spring-test-5.2.15 上。测试执行抛出错误“java.lang.IllegalStateException:测试类不能包含@Bean 方法”。
【解决方案2】:

Spring 文档建议通过构造函数自动装配所有组件。如果你遵循这个约定,你就不会遇到这个问题。

具体来说,推荐如下……

@RestController
class SomeRandomController(
        @Autowired private val ARepository: aRepository,
        @Autowired private val BRepository: bRepository,
        @Autowired private val CRepository: cRepository
){ etc ...}

然后在您的测试中,您将需要以下几行:

val aRepository = mockk<ARepository>(relaxed = true)
val bRepository = mockk<BRepository>(relaxed = true)
val cRepository  = mockk<CRepository>(relaxed = true)

val controller = SomeRandomController(aRepository, bRepository, cRepository)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2022-11-01
    • 1970-01-01
    • 2010-11-01
    相关资源
    最近更新 更多