Unit testing kotlin如何在测试中覆盖常量 请把这个扔掉,希望有一个干净的答案,除了明显的低级回答。< /P>

Unit testing kotlin如何在测试中覆盖常量 请把这个扔掉,希望有一个干净的答案,除了明显的低级回答。< /P>,unit-testing,kotlin,timer,constants,Unit Testing,Kotlin,Timer,Constants,我有一个类,它将在常量中定义的一段时间后触发。在我的测试中,我希望时间更短,以便测试运行更快。有没有办法在测试中重写常量 当前丑陋的解决方案是,我正在更改代码,以使延迟时间作为参数传递,这是丑陋的,因为此参数将仅在测试中使用 const val DELAY_BEFORE_CODE_MILLIS: Long = 300000 class CheckValues( private val vertx: Vertx ) { fun doStuff() { ve

我有一个类,它将在常量中定义的一段时间后触发。在我的测试中,我希望时间更短,以便测试运行更快。有没有办法在测试中重写常量

当前丑陋的解决方案是,我正在更改代码,以使延迟时间作为参数传递,这是丑陋的,因为此参数将仅在测试中使用

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>
    }

    ...

}

const val DELAY\u-BEFORE\u-code\u-MILLIS:Long=300000
类校验值(
私人val vertx:vertx
) {
fundostuff(){
vertx.setTimer(聚合前延迟检查毫秒){
<我想测试的代码>
}
...
}

解决方案是在
doStuff()
函数中传递延迟时间。您可以在聚合之前将
delay\u检查\u MILLIS
作为默认参数,这样呼叫者就不必每次都传递延迟时间

    fun doStuff(delayMillis: Long = DELAY_BEFORE_AGGREGATION_CHECK_MILLIS) {
        vertx.setTimer(delayMillis) {
            <code i want to test>
    }
fun doStuff(delayMillis:Long=DELAY\u在聚合\u检查\u MILLIS之前){
vertx.setTimer(延迟毫秒){
<我想测试的代码>
}
在你的测试中,你可以通过任何你想要的延迟


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

这就是我所说的,这是我当前的丑陋解决方案……它丑陋的是,我正在将生产代码更改为封装更少、更复杂的纯函数r是为了使它更易于测试。我不认为将延迟作为参数传递是难看的。我不知道您想要测试什么以及如何测试(因为
doStuff()
)中没有可见的输出。一种可能性是,假设您不测试
Vertx
对象,那么您可以在CheckValues()中传递一个模拟Vertx和mock
setTimer()