2012-08-29 5 views
1

У нас есть Java-код, который мы в идеале хотели бы работать в трех направлениях:Java утверждают без исключения

  1. сгенерирует исключение, когда assert не удается
  2. печать стека, но в противном случае продолжить, когда assert не удается
  3. игнорировать assert

Это будет работать в трех различных средах (разработка, тестирование, производство, соответственно). Мы можем переключаться между первым и последним, используя опцию -ea JVM, но можно ли сделать вторую?

Спасибо.

EDIT: у нас уже есть утверждения везде. мы предпочитаем менять эту опцию во время выполнения без изменения нашего кода.

+0

Зачем вам нужно # 2 в тестовой среде? Утверждения представляют собой операторы, которые должны всегда передаваться, а если нет, это ошибка. (Честно говоря, я предпочитаю # 1 в разработке, тестировании, производстве _and_.) –

+0

Мы не хотим, чтобы 'assert' производился на случай, если мы что-то упустили. Мы не хотим, чтобы 'assert' разрушал нашу тестовую среду, например бета-сайт. Мы хотим знать об ошибках, не испытывая остановки. – Jayen

ответ

0

Вы не можете, не используя Assert. Assert специально разработан для отказа и не игнорируется.

+0

Я думаю, что вы вводите в заблуждение ключевое слово java 'assert' с классом JUnit' Assert' –

+0

, это может быть верно и для 'assert', но я надеюсь, что кто-то знает какой-то флаг JVM, я не – Jayen

4

Похоже, вы хотите использовать модульное тестирование для этого вместо встроенного в Java assert. Посмотрите, что может сделать JUnit для вас и вашей команды.

Вы можете настроить тесты для запуска, и они сообщим вам об ошибке. Если вам нужна трассировка стека, вы можете создать свою собственную, подняв/поймав исключение, а затем используйте e.printStackTrace().

+1

testcases не тестируют то же самое, что утверждает. тестирование для функциональности. утверждают, что «это никогда не должно произойти, и если это произойдет, я не могу обещать, что я буду делать то, что должен». вам не удастся создать тестовый файл, чтобы отключить assert, и если вы можете, то вы должны обработать этот тест и не использовать assert. – Jayen

+0

Вы можете сделать и то, и другое - вы можете протестировать функциональность (т. Е. Был ли этот метод вызван? Были ли эти данные сохранены в DAO?) И утверждать вещи, которые должны быть истинными относительно состояния объекта, когда вы закончите (учитывая эти условия, эти поля содержат эти данные?). Программа должна * никогда * (на мой взгляд) неявно бросать руки вверх и волноваться. Если вы когда-либо сталкивались с подобным случаем, то должно быть что-то * истинно об объекте или среде, которые могут быть утверждены. – Makoto

+0

Я не понимаю. код уже прошел все разработанные тесты в среде разработки, среда тестирования - для дополнительного тестирования, прежде чем он начнет работать. в тестировании и производстве мы не хотим, чтобы он поднимал руки и волновался, но мы хотим, чтобы он развивался. – Jayen

0

Вы можете достичь # 2 очень легко, так как assert выбрасывает AssertionError.

try { 
    assert false; 
} catch (final AssertionError error) { 
    error.printStackTrace(); 
} 
System.out.println("survived!"); 
+0

Как это можно изменить между # 1, # 2 и # 3? это позволяет нам делать # 2 и # 3, а не # 1. – Jayen

+0

@Jayen использует флаг, чтобы определить, следует ли использовать один завернутый в 'try'-'catch' против одного нет. – oldrinb

+0

как глобальная переменная, которая устанавливается парсером аргументов? это кажется очень взломанным. не говоря уже об изменении каждого утверждения, которое мы уже имеем в нашем коде. – Jayen

Смежные вопросы