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端,所以我不希望这样。