Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/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
有没有办法在clojure中测试系统/退出?_Clojure - Fatal编程技术网

有没有办法在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(假设这是您可以实际更改的代码)-对于程序的单个组件来说,退出程序本身违反了关注点分离,这也是测试困难的原因。