Функция assertThrows проверяет тип выброшенного исключения с помощью вызова isInstance, что не всегда корректно.
Пример со студенческим решением lesson6.task1.plusMinus
fun plusMinus(expression: String): Int {
val parts = expression.split(" ")
val result = mutableListOf(parts[0].toInt())
...
return result.sum()
}
Если подать данному решению на вход строку "~JD*_c\\teH:QnPQudT,8z", оно выбросит NumberFormatException. А требуется, чтобы при неправильном формате строки выбрасывалось исключение IllegalArgumentException. При этом, тест вида:
assertThrows(IllegalArgumentException::class.java) { plusMinus("~JD*_c\\teH:QnPQudT,8z") }
отработает правильно, так как NumberFormatException является наследником IllegalArgumentException, и соответственно
IllegalArgumentException::class.java.isInstance(NumberFormatException())
возвращает true.
При этом, в котоеде выброшенные исключения проверяются через
modelException.javaClass == studentException.javaClass
и на том же самом тесте решение падает.