К сожалению, тела функций, которые вы вызываете, в том числе встроенные функции, не используются для умных приемов и вывода на неопределенность.
В вашем коде мало что можно улучшить, и я бы предложил только одно: вы можете использовать the Elvis operator с функцией Nothing
для этих утверждений утверждения. Анализ потока управления учитывает ветвь полученную в Nothing
и выводит допустимость пустого от этого:
fun failOnNull(): Nothing = throw AssertionError("Value should not be null")
val test: Foo? = foo()
test ?: failOnNull()
// `test` is not-null after that
Это может быть написано без функции, а также: test ?: throw AssertionError("...")
, так как throw
выражение также имеет тип Nothing
.
Говоря о более общем случае неудачи утверждение, можно было бы использовать fail(...): Nothing
функцию, которая обеспечивает бонусную подсказку для анализа потока управления, а также. JUnit Assert.fail(...)
не является функцией Nothing
, но вы можете найти его в модуле kotlin-test-junit
или написать свой собственный.
test as? SomeType ?: fail("`test` should be an instance of SomeType")
// smart cast works here, `test` is `SomeType`
Можете ли вы предоставить более полный пример модульного теста, который вы хотели бы улучшить? Мне проще использовать '!!. OtherProperty', чтобы утверждать, что приемник не должен быть нулевым. – miensol
@miensol, с '!!. OtherProperty' вы получаете NPE, и результат теста будет ошибкой, а не неудачным утверждением. Хотя неважно. – hotkey