【发布时间】:2021-04-20 18:43:57
【问题描述】:
有没有更简洁/优雅的方式在 Micronaut 中实现此功能?
@MicronautTest
class ControllerTest {
@Inject
@field:Client("/")
lateinit var client: RxHttpClient
@Inject
lateinit var redeemService: RedeemService
@MockBean(RedeemService::class)
fun redeemService(): RedeemService = mockk {
every { validate(any()) } returns true
}
@Test
fun test() {
// some logic triggering a call to redeemService
verify(exactly = 1) {
redeemService.validate("123")
}
}
}
对我来说,必须声明 @MockBean 然后还必须声明 @Inject 之前声明的 @MockBean 似乎是多余的工作。
据我所知,在 Spring Boot 中,这只是 lateinit var 上的注释。
我是否误解或忽略了什么?
【问题讨论】:
-
“对我来说,必须声明 MockBean 然后还必须注入先前声明的 MockBean 看起来像是多余的工作” - 通常模拟不会注入到测试中,而是注入到组件中正在测试。在您的情况下,您的测试除了模拟本身之外不测试任何东西,因此不清楚您真正想要完成什么。
-
我猜 Mock 可以服务于 2 个目的:将单元的行为与系统的其余部分隔离开来 + 捕获跨越此边界的信息(以及频率等)。对我来说,经常使用这两个功能是完全正常的,这就是为什么我也在 Micronaut 中寻找类似于 github.com/Ninja-Squad/springmockk 的东西。
标签: unit-testing junit micronaut mockk