【问题标题】:kotlin how to overwrite const in testkotlin如何在测试中覆盖const
【发布时间】:2020-06-25 07:00:29
【问题描述】:

只是把这个扔在那里,希望除了明显低于标准的答案之外还有一个干净的答案。

我有一个类会在 const 中定义的一段时间后触发。在我的测试中,我希望那个时间更小,以便测试运行得更快。有没有办法在测试中覆盖 const?

目前丑陋的解决方案是我正在更改代码,以便将延迟时间作为参数传递,这很丑陋,因为该参数只会在测试中使用。

const val DELAY_BEFORE_CODE_MILLIS: Long = 300000

class CheckValues(
    private val vertx: Vertx
) {
   
    fun doStuff() {
        vertx.setTimer(DELAY_BEFORE_AGGREGATION_CHECK_MILLIS) {
            <code i want to test>
    }

    ...

}

【问题讨论】:

    标签: unit-testing kotlin timer constants


    【解决方案1】:

    解决方案是在doStuff() 函数中传递延迟时间。您可以将DELAY_BEFORE_AGGREGATION_CHECK_MILLIS 作为默认参数,这样调用者就不必每次都通过延迟时间

        fun doStuff(delayMillis: Long = DELAY_BEFORE_AGGREGATION_CHECK_MILLIS) {
            vertx.setTimer(delayMillis) {
                <code i want to test>
        }
    

    在您的测试中,您可以通过任何您想要的延迟。

    这是更简洁的代码和测试的一般经验法则。您无需在类或函数内部创建依赖项,而是将它们作为构造函数或函数参数传递。

    【讨论】:

    • 这就是我所说的我目前丑陋的解决方案......这很丑陋,因为我正在更改生产代码以减少封装和更复杂,纯粹是为了使其更可测试。跨度>
    • 我认为将延迟作为参数传递并不难看。我不知道你想测试什么以及如何测试(因为doStuff() 中没有可见的输出)。一种可能性是,假设您不测试 Vertx 对象,您会在 CheckValues() 中传递一个模拟 Vertx 并模拟 setTimer()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2018-07-01
    相关资源
    最近更新 更多