Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 仅限MockK System.getenv_Unit Testing_Kotlin_Tdd_Mockk - Fatal编程技术网

Unit testing 仅限MockK System.getenv

Unit testing 仅限MockK System.getenv,unit-testing,kotlin,tdd,mockk,Unit Testing,Kotlin,Tdd,Mockk,语言:科特林 目标是测试一个在内部调用System.getenv的方法,我想让这个方法产生一个预定义的结果 尝试: mockkStatic(System::class) every { System.getenv(any()) } answers { when { firstArg() as String == "clientId" -> "aaa" firstArg() as String

语言:科特林

目标是测试一个在内部调用
System.getenv
的方法,我想让这个方法产生一个预定义的结果

尝试:

mockkStatic(System::class)

    every {
        System.getenv(any())
    } answers {
        when {
            firstArg() as String == "clientId" -> "aaa"
            firstArg() as String == "clientSecret" -> "bbb"
            else -> throw IllegalArgumentException("something went wrong")
        }
    }

    mockkStatic(System::class)
这似乎让JVM有点醉了:

Exception in thread "main" java.lang.StackOverflowError
Exception: java.lang.StackOverflowError thrown from the UncaughtExceptionHandler in thread "main"

如何测试这样的方法?(可以想象,很多代码都使用环境变量)

您编写了一个内部使用System.getenv的高级抽象,并将该高级抽象注入到所有代码中,这使得您可以在测试功能代码时轻松模拟该抽象。这就是我最终要做的。。。这是幸运的,因为我拥有正在测试的代码,并且有能力重构它。我问这个问题的原因是b/c通常不应该编写需要使用
staticmock
的代码。。。然而,当编写针对遗留代码库的测试时,它经常成为必要的,遗留代码库确实在诸如“系统”这样的入侵性模拟对象上使用静态方法。。。所以我想知道是否有一种机制可以本质上“刺探”其简单的答案:“如果可以的话,不要嘲笑系统”。如果它挂起,根据我的经验,很可能很难修复MockK端,所以我不希望这样。您编写一个内部使用System.getenv的高级抽象,并将该高级抽象注入到所有代码中,这让你在测试功能代码时可以很容易地模仿这个抽象。这就是我最终不得不做的。。。这是幸运的,因为我拥有正在测试的代码,并且有能力重构它。我问这个问题的原因是b/c通常不应该编写需要使用
staticmock
的代码。。。然而,当编写针对遗留代码库的测试时,它经常成为必要的,遗留代码库确实在诸如“系统”这样的入侵性模拟对象上使用静态方法。。。所以我想知道是否有一种机制可以本质上“刺探”其简单的答案:“如果可以的话,不要嘲笑系统”。如果它挂起,根据我的经验,很可能很难修复MockK端,所以我不希望这样。