[Day 24] 新功能又来了!时间相关的测试!

这次,需求单位又提出了一个新的想法:
我们可不可以设计一个 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

简单说,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

>>:  Python 练习

[Day04] - 新拟物风按钮(二) - shadow dom 介绍

昨天我们做了一个不能点的 neuomorphic-button 今天我们把他可以点击 & 加...

视觉化KBARS日K(2)-日K成果展示

先上最後的成果图~ 今天我们的范例换一个套件, 这次我们使用的是echarts, 跟之前一样,取出k...

Day 28 - [Android APP] 06-RecyclerView与资料显示

这几天我们已经从 API 取得资料到包装成物件,再来就是资料显示罗。 这两天的范例会以对话页面为主,...

Day30

跟熊熊的课程学习也告一段落了,草莓也发现自己要学的还有很多,同时觉得这一个月的自己变得很不ㄧ样,原来...

第 19 集:Bootstrap 客制化 Sass 必备知识(下)

此篇接续客制化 sass 基础语法以及观念下集,尚未观看上集可以先看完再来看下集。 Operato...