2014-09-06 3 views
1

Я борюсь с каким-то странным поведением утверждения в тесте JUnit , который меня смущает.Никаких исключений в пределах утверждают?

@Test 
public void ArticleTest() 
{ 
    Article ArticeToTest = null; 

    assert(ArticeToTest.get_price() == price); //No exception here!? 
    boolean test = ArticeToTest.get_price() == price; //NullPointerException! 
} 

Я действительно не понимаю, почему утверждение не вызывает никаких исключений. Возможно даже, что я пропустил эту строку в режиме отладки без какой-либо ошибки, Исключение происходит только в последней строке. Если я удалю последнюю строку, тест окажется зеленым !?

Я работаю с Eclipse Luna (4.4.0), javac 1.8.0_20 и JUnit 4.11.

+0

Привет, Маркус, если один из приведенных ниже ответов решает вашу проблему, пожалуйста, примите это. –

ответ

3

Утверждения Java активны только в том случае, если JVM запущен с -ea (Enable Assertions).

Вы уверены, что используете его с параметром -ea?

Вы можете проверить это в своих конфигурациях запуска Eclipse.

1

Попробуйте assertTrue(), а не assert(). Кроме того, это просто путает людей, если имена ваших местных переменных начинаются с заглавной буквы.

EDIT: Хорошо, так что происходит с вашим тестом? Обычно я ожидал, что любая из этих трех вещей случится в тесте: (1) Упорядочить (2) Закон (3) Утвердить, что почти наверняка Assert присутствует как последнее, что происходит (если не существует подразумеваемой проверки против ложных объектов, возможно). Это похоже на то, что вы хотели использовать такое утверждение, которое включено с помощью -ea при запуске кода, но это не то, что я ожидаю увидеть в тестовом примере.

3

assert Ключевое слово не предназначен для проверки во время тестирования, но и для создания инвариантов, которые проверяются во время выполнения, если вы скажете Java явно, чтобы проверить их (с помощью -ea или -enableassertions), см также Programming With Assertions. Обратите внимание, что это может быть полезно во время тестирования, но это не то же самое, что модульное тестирование. Если утверждения отключены (по умолчанию), то весь оператор равен игнорируется.

Однако при модульном тестировании вам необходимо использовать средство утверждения своей тестовой среды. Для JUnit это org.junit.Assert. Обычно он предоставляет больше возможностей для передачи тестовых сбоев, и он не требует разрешения утверждений, как вам нужно делать с assert.

1

Ключевое слово assert не должно выбрасывать Exception, оно выбрасывает Error, если оно включено в JVM. Он используется для проверки допущений в коде (т. Е. Как быстрый [читаемый: ленивый] способ сделать защитное программирование), например, является ли параметр отличным от нуля, попадает в допустимые значения, является допустимым URL и т. Д., И не должен быть используется для автоматизированного (единичного) тестирования. Для этого вы должны использовать класс тестирования Assert.