我有运行(System/exit 0)
的代码,我想测试该部分代码。我尝试用with-redefs
测试它,但我发现我不允许对Java方法这样做。我该如何测试呢?
答案 0 :(得分:9)
对不起,你不能直接模拟那个功能,虽然像所有好的CS问题*你可以通过添加一个额外的间接级别来解决它:
(defn exit-now! []
(System/exit 0))
然后在你的测试中你可以 - 现在重新调用对clojure函数exit的调用。
(with-redefs [exit-now! (constantly "we exit here")]
(is (= "we exit here" (code that calls exit))))
也许你可以推动该功能的开发人员远离在项目深处调用System / exit的做法。
*当然除了性能问题。
答案 1 :(得分:7)
如果您确实需要测试System/exit
的来电,可以使用SecurityManager
来禁止这些来电,然后抓住结果SecurityException
:
(System/setSecurityManager
(proxy [SecurityManager] []
(checkExit [status]
(throw (SecurityException.
(str "attempted to exit with status " status))))
(checkCreateClassLoader []
true)
(checkPermission [_]
true)))
(System/exit 5)
;> SecurityException attempted to exit with status 5 user/eval6/fn--11 (NO_SOURCE_FILE:2)
(try (System/exit 5) (catch SecurityException e :foo))
;= :foo
一般情况下,将方法调用包装在像Arthur建议的函数中往往是更安全的方法。