这次,需求单位又提出了一个新的想法:
我们可不可以设计一个 API,允许用户在 2021/12/31 23:59:59 之前才能参加该活动。之後的用户都不允许参加活动呢?
参与活动的逻辑很简单,只是新增资料而已。这段我们不担心。不过针对时间的限制,该怎麽在自动测试里面进行控制呢?
今天我们就来聊聊这个部分!
首先,我们先来撰写验证时间的逻辑 isValidDate()
,如果现在时间还没到 2021/12/31 23:59:59 回传 true
,其余时间回传 false
这边我们利用 java.time.*
套件
import java.time.*
fun isValidDate(): Boolean {
val clock = Clock.fixed(Instant.now(), ZoneId.of("UTC"))
val now = LocalDateTime.now(clock)
val dueDate = LocalDateTime.parse("2021-12-31T23:59:59")
return dueDate.isAfter(now)
}
逻辑撰写好了之後,我们先简单的测试一下
建立一个 IsValidDateKtTest.kt
并撰写以下逻辑
import org.junit.Test
internal class IsValidDateKtTest {
@Test
fun `确认isValidDate`() {
println(isValidDate())
}
}
运行过後,我们可以看到确实印出 true
。
可是我们并不知道在其他的时间里,特别是超过
这边,我们要介绍一个协助我们建立 test double 的框架:mockk!
简单说,mockk 是一个测试时协助我们在测试时,建立 test double 的框架。
引用的方式一样透过 gradle,相信各位都很熟悉了
testImplementation("io.mockk:mockk:1.12.0")
引入之後,我们就可以利用 mockk 框架来协助我们假造 LocalDateTime.now()
我们想测试的案例是 在2022/01/01时应该回传false
在程序里面,我们取得现在时间的逻辑是
val clock = Clock.fixed(Instant.now(), ZoneId.of("UTC"))
val now = LocalDateTime.now(clock)
我们透过把 clock
写死
来控制测试执行的时间是 2022-01-01T23:59:59
fun `确认isValidDate`() {
val fixedClock = Clock.fixed(
Instant.parse("2022-01-01T23:59:59Z"),
ZoneId.of("UTC")
)
mockkStatic(Clock::class)
every { Clock.systemUTC() } returns fixedClock
}
我们如果先将 isValidDate()
改写,看看实际取得的 now()
内容
val clock = Clock.fixed(Instant.now(), ZoneId.of("UTC"))
val now = LocalDateTime.now(clock)
val dueDate = LocalDateTime.parse("2021-12-31T23:59:59")
println(now)
会印出
2022-01-01T23:59:59
这代表,透过假造我们的 Clock
物件,我们可以在测试程序里面控制我们的时间了!
现在我们可以将 在2022-01-01时应该回传false()
写完
@Test
fun `在2022-01-01时应该回传false`() {
val fixedClock = Clock.fixed(
Instant.parse("2022-01-01T23:59:59Z"),
ZoneId.of("UTC")
)
mockkStatic(Clock::class)
every { Clock.systemUTC() } returns fixedClock
Assert.assertThat(isValidDate(), `is`(false))
}
执行并确认通过之後,我们可以趁机再加上 在2021-12-30时应该回传true
@Test
fun `在2021-12-30时应该回传true`() {
val fixedClock = Clock.fixed(
Instant.parse("2021-12-30T23:59:59Z"),
ZoneId.of("UTC")
)
mockkStatic(Clock::class)
every { Clock.systemUTC() } returns fixedClock
Assert.assertThat(isValidDate(), `is`(true))
}
这样,我们的 isValidDate()
功能和测试就写完了!
<<: 那些被忽略但很好用的 Web API / CustomEvent
昨天我们做了一个不能点的 neuomorphic-button 今天我们把他可以点击 & 加...
先上最後的成果图~ 今天我们的范例换一个套件, 这次我们使用的是echarts, 跟之前一样,取出k...
这几天我们已经从 API 取得资料到包装成物件,再来就是资料显示罗。 这两天的范例会以对话页面为主,...
跟熊熊的课程学习也告一段落了,草莓也发现自己要学的还有很多,同时觉得这一个月的自己变得很不ㄧ样,原来...
此篇接续客制化 sass 基础语法以及观念下集,尚未观看上集可以先看完再来看下集。 Operato...