DP_*_*DP_ 0 unit-testing clojure
我有以下 Clojure 代码:
(defn is-valid-lang
[lang]
(.contains (list "ru" "en" "de") lang))
(defn s
[txt]
{
:desc txt
:lang "ru"
})
(defn s
[txt lang]
(if-not (is-valid-lang lang)
(throw (.IllegalArgumentException (format "'%s' is an invalid language." lang)))
{
:desc txt
:lang lang
}
)
)
Run Code Online (Sandbox Code Playgroud)
我想编写一个测试来验证s抛出的异常的消息,如果lang无效。
我是这样写的:
(deftest s-lang-invalid-lang-test
(is
(thrown-with-msg?
IllegalArgumentException
#"'invalid-language' is an invalid language."
(s "something" "invalid-language")
)
)
)
Run Code Online (Sandbox Code Playgroud)
由于以下错误,测试失败:
error {
:cause "No matching field found: IllegalArgumentException for class java.lang.String"
:via
[{:type java.lang.IllegalArgumentException
:message "No matching field found: IllegalArgumentException for class java.lang.String"
:at [clojure.lang.Reflector getInstanceField "Reflector.java" 397]}]
:trace
Run Code Online (Sandbox Code Playgroud)
如果s抛出带有正确消息的异常,我该如何解决这个问题并确保测试成功?
更新 1:修复了 cfrick 指出的多个 arity 问题。
(defn s
([txt]
{
:desc txt
:lang "ru"
})
([txt lang]
(if-not (is-valid-lang lang)
(throw (IllegalArgumentException. (format "'%s' is an invalid language." lang)))
{
:desc txt
:lang lang
})
)
)
Run Code Online (Sandbox Code Playgroud)
您没有正确实例化 IllegalArgumentException。Clojure 使用:
(IllegalArgumentException. "your message")
Run Code Online (Sandbox Code Playgroud)
调用Java构造函数。请参阅有关 Java 互操作的这篇文章