我想测试一个函数(下文的foo/my-function-under-test
)是否能如预期处理异常。具体来说,该函数调用clj-http.client/get
发起HTTP请求,如果主机不可用,我想要被测试的函数最多重试3次。如果在3次重试后仍然无法连接到主机,我想要该函数抛出我的ServiceUnavailable
异常。
下面的代码是错误的,但它应该表达我的意图。我知道retries-count
不是一个变量。我也知道我可以使用动态重新绑定来让它表现得像变量。但有没有一种不模拟变量的函数式方法来做这件事?(强调)
(deftest retries
(let [retry-count 0]
(with-redefs [clj-http.client/get (fn [url & [req & r]]
retry-count++
(throw (UnknownHostException. "Some message")))]
(is (thrown? ServiceUnavailable (foo/my-function-under-test)))
(is (= 3 retry-count)))))