首页 > 解决方案 > 如何使用 Mockk 在 Kotlin 中模拟 LocalDateTime()

问题描述

我正在为创建匿名用户的 UserService 编写测试,其中一部分包括在创建时保存时间戳。时间似乎在测试函数本身中被正确地模拟了,但是当在实际的 UserService 中添加时间戳时,会返回实时时间。我如何正确地模拟它?

相关的 UserService 功能是:

用户服务.kt

fun createAnonymousUser(jwt: AuthenticationJsonWebToken): User {

    val user = User()

    user.anonUserId = jwt.name 
    user.createdAt = LocalDateTime.now(ZoneOffset.UTC)

    return userRepository.save(user)
}

用户服务.test.kt

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
open class UserServiceTest {
    private val jwt = mockk<AuthenticationJsonWebToken>()
    private val userRepository = mockk<UserRepository>()
    private val authProperties = AllAuthProperties()
    private val fixedClock = mockk<LocalDateTime>()
    private val slotUser = slot<User>()

    @BeforeTest
    internal fun init() {
        clearAllMocks()
    }

    @Test
    fun getMe() {
        every { jwt.name } returns "anonymous|123"
        every { LocalDateTime.now() } returns LocalDateTime.MAX

        val userService = UserService(userRepository, authProperties)

        val user = User();
        user.anonUserId = jwt.name
        user.createdAt = LocalDateTime.now()

        every { userRepository.save(capture(slotUser)) } returns user
        val anonUser = userService.getMe(jwt)


        verify { userRepository.save(anonUser) }
        assertEquals(anonUser, user)
    }
}

我只是不确定如何完成我正在尝试的事情。

标签: spring-bootkotlinmockk

解决方案


事实证明我基本上是对的。我只需要稍微调整一下。

verify { userRepository.save(anonUser.capture) } 
assertEquals(anonUser, user)

推荐阅读