有没有办法在clojure中测试System / exit?

时间:2015-03-26 21:24:46

标签: clojure

我有运行(System/exit 0)的代码,我想测试该部分代码。我尝试用with-redefs测试它,但我发现我不允许对Java方法这样做。我该如何测试呢?

2 个答案:

答案 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建议的函数中往往是更安全的方法。