如何在 Clojure 测试中测试预期异常的消息?

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)

dpa*_*sen 5

您没有正确实例化 IllegalArgumentException。Clojure 使用:

(IllegalArgumentException. "your message")
Run Code Online (Sandbox Code Playgroud)

调用Java构造函数。请参阅有关 Java 互操作的这篇文章