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`
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
@miensol, z '!!. OtherProperty' otrzymujesz NPE, a wynikiem testu będzie błąd, a nie niepowodzenie asercji. Ale to nic wielkiego. – hotkey