Кто-нибудь может сказать мне, что не так с этим псевдокодом?

#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); , чтобы увидеть, что происходит.