2015-08-18 2 views
2

Это работает для меня:Clojure тестирования: тестирование отрицания утверждения

(is (thrown? AbstractMethodError (.fun obj 1))) 

Но это взрывает

(is (not (thrown? AbstractMethodError (.fun obj 1)))) 

со следующей ошибкой:

java.lang.RuntimeException: Unable to resolve symbol: thrown? in this context 

Предположительно «брошенным ?» имеет какое-то особое значение внутри «есть» и не видно, когда я помещаю «не» в путь.

Итак, как я могу проверить отрицание такого утверждения, как брошенное?

+0

Возможный дубликат [Clojure unit-testing. Как проверить, генерирует ли функция исключение?] (Http://stackoverflow.com/questions/32063244/clojure-unit-testing-how-do-i-test-if-a-function-throws-an-exception) –

+0

@NathanDavis Это связано, но это должно быть отдельной частью более крупного вопроса. – interstar

ответ

3

Вы правы, thrown? - special assertion, который должен появиться после is. Если вы хотите проверить, что исключение не выкидывается (другими словами, вызов оценивается на что-то), вы можете захотеть сделать что-то вроде:

(is (.fun obj 1))

хотя что есть одна проблема: было бы ошибкой, если результат ложный (false, nil). Должно быть абсолютно уверенным:

(let [r (.fun obj 1)] 
    (is (= r r))) 

(это тавтология, и она будет терпеть неудачу, если она вызывает исключение).

+1

На самом деле, что мне действительно интересно в тестировании, есть ли у obj на самом деле есть метод .fun. Можете ли вы придумать лучший способ сделать это? – interstar

+1

Через отражение api. См. Этот ответ, например: http://stackoverflow.com/questions/5821286/how-can-i-get-the-methods-of-a-java-class-from-clojure –

Смежные вопросы