#java #junit
#java #junit
Вопрос:
Я не знаком с JUnit, поэтому не уверен, что проблема в этом assertTrue(b_exception);
, потому что, если бы я поместил System.out.println("something");
туда, это напечатало бы «что-то»… Спасибо!!
Пожалуйста, обратите внимание, что это псевдокод, сосредоточьтесь на логике.
b_exception = false;
try{
somethingThrowError();
}catch(Error e){
b_exception = true;
}
assertTrue(b_exception);
Комментарии:
1. Что неожиданного?
2. Я не понимаю, о чем вы спрашиваете… в psudo-коде нет ничего плохого? вы хотите сказать, что b_exception все время имеет значение false?
3. В написанном вами коде вашему логическому значению присваивается значение false, вы пытаетесь выполнить что-то, что выдает исключение (я предполагаю), затем оно перехватывается, что присваивает логическому значению значение true, наконец, ваш оператор assert проверяет, что это true, и выполнение будет продолжено после этого блока. Что вы ожидаете, что произойдет?
4. Является ли
b_exception
локальной переменной или она можетsomethingThrowError
установить для нее значение true без выдачи ошибки? ПочемуError
и нетThrowable
? Вы хотите, чтобы утверждение прошло или завершилось ошибкой, еслиsomethingThrowError
выдаетException
вместоError
an?5. Кто-то спросил меня об этом вопросе, это все, что у меня есть, и он сказал, что здесь ошибка, но я не вижу ничего плохого в его логике … Итак … у кого-нибудь есть идеи? Помните, это всего лишь псевдокод, и в его логике есть одна ошибка … это единственное попадание, которое у меня есть. Пожалуйста, дайте мне знать, если вы знаете ответ. Спасибо!!
Ответ №1:
Я не знаю, в чем проблема с вашим кодом, потому что вы не указали, почему он не соответствует вашим ожиданиям, но правильная идиома для проверки того, что генерируется исключение, — использовать аннотации JUnit 4:
@Test(expected=SpecificError.class)
public void testError(){
somethingThrowError();
}
Комментарии:
1. Это просто псевдокод, и мой друг сказал мне, что что-то не так, например, вопрос для тестирования… но я действительно не смог найти никакой логической ошибки в этом фрагменте кода. Итак … пожалуйста, дайте мне знать, если вы знаете, что не так с кодом, с точки зрения логики. Спасибо!!
Ответ №2:
Я могу только догадываться, что вы ищете это:
try{
somethingThrowError();
fail("Exception expected");
}catch(AsSpecificAsPossibleException e){
//should happen, OK
//optionally assert exception message, etc.
}
Также обратите внимание, что перехватывать Error
— плохая идея, используйте как можно более конкретное исключение.
ОБНОВЛЕНИЕ: ответ Майкла Боргвардта от @Michael Borgwardt на самом деле даже лучше, но только если в вашем тесте нет ничего, кроме одной строки (ничего другого, что может выдать). Также @Test(expected
не позволяет вам выполнять дополнительные утверждения сообщений об исключениях (но должны ли вы?)
Комментарии:
1. На самом деле это настолько плохая идея, что этот код сломан, поскольку fail () также просто выдает AssertionError …
2. @MichaelBorgwardt: Вау, хороший улов, исправлено, спасибо! Я не помню, когда в последний раз я использовал
Error
явно…
Ответ №3:
Не уверен, что, по-вашему, не так с этим кодом.
assertTrue
Всегда будет выполняться, как и System.out.println
.
Это — assertTrue
— будет сигнализировать об ошибке, если аргумент не является true
, или «пройти тест», если аргумент является true
.
Может быть, вам следует использовать System.out.println("b_exception = " b_exception);
, чтобы увидеть, что происходит.