有没有办法在clojure中测试系统/退出?
我有运行有没有办法在clojure中测试系统/退出?,clojure,Clojure,我有运行(系统/退出0)的代码,我想测试这部分代码。我试着用redefs测试它,但我发现我不允许对Java方法这样做。我怎样才能测试这个呢?对不起,你不能直接模拟这个函数,尽管像所有好的CS问题一样,你可以通过添加一个额外的间接层来解决它: (defn exit-now! [] (System/exit 0)) 然后在测试中,您可以使用redef立即退出对clojure函数的调用 (with-redefs [exit-now! (constantly "we exit here")]
(系统/退出0)
的代码,我想测试这部分代码。我试着用redefs测试它,但我发现我不允许对Java方法这样做。我怎样才能测试这个呢?对不起,你不能直接模拟这个函数,尽管像所有好的CS问题一样,你可以通过添加一个额外的间接层来解决它:
(defn exit-now! []
(System/exit 0))
然后在测试中,您可以使用redef立即退出对clojure函数的调用
(with-redefs [exit-now! (constantly "we exit here")]
(is (= "we exit here" (code that calls exit))))
也许您可以让该功能的开发人员远离在项目内部调用System/exit的做法
*当然除了性能问题 如果确实需要测试对System/exit
的调用,可以使用a来禁用它们,然后捕获生成的SecurityException
s:
(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建议的函数中往往是更明智的方法。我认为您应该尽量避免在主函数之外调用System/exit(假设这是您可以实际更改的代码)-对于程序的单个组件来说,退出程序本身违反了关注点分离,这也是测试困难的原因。