Объединение нулевой безопасности и assertNotNull

В тесте у нас обычно есть assertNotNull , но он не выполняет интеллектуальный приведение от нулевого типа к не-nullable. Я должен написать что-то вроде этого:

 if (test == null) { Assert.fail("") return } 

Это обходной путь для выполнения умного приведения только с assertNotNull ? Как вы справляетесь с этим?

К сожалению, те функции функций, которые вы называете, в том числе встроенные функции, не используются для интеллектуальных приемов и вывода с нулевым значением.

В вашем коде мало что можно улучшить, и я бы предложил только одно: вы можете использовать оператор Элвиса с функцией 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`