2012-02-07 13 views
5

Nie podoba mi się słowo kluczowe java assert, ponieważ nie jest ono zawsze włączone w kodzie produkcyjnym. Szukam dobrej klasy "ProductionAssert" do użycia, która zawsze uruchamia odnotowane twierdzenia.Dobra klasa asertywna do użytku produkcyjnego? Odpowiednik Java PowerAssert Groovy?

Jednym z kandydatów jest Guava's Preconditions. Jest przyzwoity, ale nieco ograniczony (na przykład nr assertEquals(), assertNull(), assertGreaterEquals()).

Jedną z alternatyw jest jUnit lub inny framework testowy ... ale niechętnie polegam na całym środowisku testowym tylko dla prostej klasy assert.

Gdybym programował w Groovy, użyłbym PowerAssert.

Czy istnieje dobra klasa "ProductionAssert" dla języka Java?

P.S. - jedną z opcji jest w końcu sprawdzenie czegoś takiego jak Java Contracts ... ale czego szukam teraz to absolutne minimum, zero tarcia, po prostu upuść bez żadnych zmian w procesie budowania klasy ... Nie jestem pewien, czy umowy pasują do tego opisu.

+0

nie warto napisać klasę PowerAssert od podstaw? – vulkanino

+0

@vulkanino - Zacząłem to robić ... ale zwykle wolę raczej je wykorzystywać niż reimplementować, chyba że jest ku temu dobry powód. – ripper234

+0

Tak samo ja, ale napisałeś "absolutne minimum, zero tarcia" ... – vulkanino

Odpowiedz

2

I mają tendencję do używania Wiosny Assert Klasa:

public void thing(String foo){ 
    Assert.hasText(foo, "'foo' is required"); 
} 

Oczywiście, jeśli nie za pomocą sprężyny wtedy to nie zamierzam unosić swoją łódź i nie jestem pewien, czy jest o wiele lepszy od guawy.

3

Używałbym Junit. Jest przeznaczony do korzystania z tych testów.

Inną opcją jest zapewnienie, że gwarancje są zawsze włączone. np. jeśli nie możesz kontrolować swojego środowiska produkcyjnego. Możesz spowodować, że program się zawiedzie, jeśli tak nie jest.

boolean assertOn = false; 
assert assertOn = true; 
if (!assertOn) 
    throw new AssertionError("Assertions must be turned on"); 

Trzecią opcją jest samodzielne zapisanie tych metod. Zwykle są tylko dwa wiersze kodu. W ten sposób zrobią wszystko, co chcesz.

+0

Nie myślałem o spowodowaniu awarii programu, jeśli asserts nie są włączone - ciekawe skręty. Na razie używam opcji 3 i czekam na więcej odpowiedzi/głosów. – ripper234

+1

Dodano kod do wykrywania, czy są włączone asercje. –

0

Możesz użyć valid4j z hamcrest-matchers (znalezione na Maven Central jako org.valid4j: valid4j). Domyślny dostawca wyrzuca AssertionError, ale w razie potrzeby możesz zarejestrować własną, dostosowaną politykę globalną.

Dla warunków (takich twierdzeń naprawdę):

import static org.valid4j.Assertive.*; 

require(x, greaterThan(0)); // throws RequireViolation extends AssertionError 

podobne wsparcie dla postconditions wykorzystujących 'zapewnienie'.

Na marginesie: Możesz użyć tej samej biblioteki do regularnego sprawdzania poprawności danych wejściowych (np.rzucanie wyjątki wydobywalne):

import static org.valid4j.Validation.*; 

validate(argument, isValid(), otherwiseThrowing(InvalidException.class)); 

Linki: