2017-02-05 15 views
8

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

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

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

+0

Можете ли вы предоставить более полный пример модульного теста, который вы хотели бы улучшить? Мне проще использовать '!!. OtherProperty', чтобы утверждать, что приемник не должен быть нулевым. – miensol

+0

@miensol, с '!!. OtherProperty' вы получаете NPE, и результат теста будет ошибкой, а не неудачным утверждением. Хотя неважно. – hotkey

ответ

7

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

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

Вы также можете выполнить 'test?: Fail (" ... ")' – mfulton26

+1

@ mfulton26, но JUnit 'Assert.fail()' не является функцией 'Nothing', поэтому из этого утверждения не будет указаний на невозможность , Или есть библиотека тестирования Kotlin, поставляемая с функцией fail(): Nothing? – hotkey

+1

'kotlin.test.fail' из' kotlin-test' (транзитивная зависимость 'kotlin-test-junit'). Я полагаю, что SO не может использовать 'kotlin-test', хотя это и хорошо. – mfulton26