2017-02-05 16 views
8

W teście zwykle mamy assertNotNull, ale nie wykonuje on rzucania inteligentnego z typu nullable na nie-nullable. Muszę napisać coś takiego:Łączenie bezpieczeństwa null i assertNotNull

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

jest to obejście wykonać inteligentnego obsady tylko assertNotNull rozmowy? Jak sobie z tym radzisz?

+0

Czy możesz podać pełniejszy przykład testu jednostki, który chcesz poprawić? Ułatwiam użycie '!!. OtherProperty', aby potwierdzić, że odbiornik nie powinien mieć wartości null. – miensol

+0

@miensol, z '!!. OtherProperty' otrzymujesz NPE, a wynikiem testu będzie błąd, a nie niepowodzenie asercji. Ale to nic wielkiego. – hotkey

Odpowiedz

7

Niestety, funkcje wywoływanych funkcji, w tym funkcje wbudowane, nie są używane do inteligentnych rzutów i wnioskowania o wartościowania.

Nie ma wiele w kodzie, które można poprawić, i chciałbym tylko zasugerować jedną rzecz: można użyć the Elvis operator z funkcją Nothing dla tych stwierdzeń twierdzeń. Analiza przepływu sterowania uwzględnia oddziały prowadzące do Nothing i wnioskuje opcje dopuszczania wartości null od tego:

fun failOnNull(): Nothing = throw AssertionError("Value should not be null") 

val test: Foo? = foo() 

test ?: failOnNull() 
// `test` is not-null after that 

To może być napisany bez funkcji, a także: test ?: throw AssertionError("..."), ponieważ throw wyrażenie ma również typ Nothing.


Mówiąc o bardziej ogólnym przypadku nie twierdzenie, można użyć fail(...): Nothing funkcję, która zapewnia podpowiedź bonusowy dla analizy przepływu sterowania, jak również. JUnit Assert.fail(...) nie jest funkcją Nothing, ale można ją znaleźć w module kotlin-test-junit lub napisać własną.

test as? SomeType ?: fail("`test` should be an instance of SomeType") 
// smart cast works here, `test` is `SomeType` 
+1

Możesz również wykonać polecenie 'test?: Fail (" ... ")' – mfulton26

+1

@ mfulton26, ale JUnit 'Assert.fail()' nie jest funkcją 'Nothing', dlatego nie będzie żadnej wnioskowania o zerowalności z tego stwierdzenia . Czy istnieje biblioteka testowa Kotlin dostarczana z funkcją 'fail(): Nic'? – hotkey

+1

'kotlin.test.fail' z' kotlin-test' (przechodnia zależność 'kotlin-test-junit'). Przypuszczam, że SO może nie używać 'testu kotlin', więc jest to dobry punkt. – mfulton26