Добавление пользовательских сообщений в тесты исключений стиля JUnit4 - PullRequest
1 голос
/ 01 декабря 2010

У меня есть следующий тест:

@Test(expected=ArithmeticException.class) 
   public void divideByZero() {
   int n = 2 / 1;
}

как видно здесь .

Я хотел бы добавить сообщение, которое будет напечатано, если этот тест не пройден.

Например, если бы я выполнял тест утверждения, я бы сделал следующее, чтобы добавить сообщение:

@Test public void assertFail(){
    Assert.fail("This is the error message I want printed.");
    Assert.assertEquals(true, false);
}

Второй пример должен распечатать «Это сообщение об ошибке, которое я хочу напечатать.».Как установить текст первого примера сообщения?

Ответы [ 4 ]

2 голосов
/ 01 декабря 2010

Возможно @Rule аннотация должна помочь. В свой класс модульного теста добавьте вот что:

import org.junit.Rule;
import org.junit.rules.MethodRule;
import org.junit.runners.model.Statement;
import org.junit.runners.model.FrameworkMethod;
import org.junit.internal.runners.model.MultipleFailureException;
...
@Rule
public MethodRule failureHandler = new MethodRule()
{
    @Override
    public Statement apply(final Statement base, FrameworkMethod method, Object target)
    {
        return new Statement()
        {
            @Override
            public void evaluate() throws Throwable
            {
                List<Throwable> listErrors = new ArrayList<Throwable>();
                try
                {
                    // Let's execute whatever test runner likes to do
                    base.evaluate();
                }
                catch (Throwable testException)
                {
                    // Your test has failed. Store the test case exception
                    listErrors.add(testException);                        
                    // Now do whatever you need, like adding your message,
                    // capture a screenshot, etc.,
                    // but make sure no exception gets out of there -
                    // catch it and add to listErrors
                }
                if (listErrors.isEmpty())
                {
                    return;
                }
                if (listErrors.size() == 1)
                {
                    throw listErrors.get(0);
                }
                throw new MultipleFailureException(listErrors);
            }
        };
    }
};

Вместо того, чтобы собирать все исключения в listErrors, вы можете обернуть testException своим исключением дополнительным сообщением и просто выбросить его.

1 голос
/ 25 июня 2012

Если вы готовы использовать catch-exception вместо встроенных в JUnit механизмов обработки исключений, то ваша проблема может быть легко решена:

catchException(myObj).doSomethingExceptional();
assertTrue("This is the error message I want printed.",
           caughtException() instanceof ArithmeticException);
1 голос
/ 02 декабря 2010

Я рекомендую вместо этого называть тест, чтобы было понятно, что тест тестирует, поэтому, когда некоторые из ваших тестов не пройдены, они сообщают вам, в чем проблема.Вот пример использования правила ExpectedException:

@RunWith(JUnit4.class)
public class CalculatorTest {
  @Rule
  public ExpectedException exception = ExpectedException.none();

  @Test
  public void divisionByZeroShouldThrowArithmeticException() {
    Calculator calculator = new Calculator();

    exception.expect(ArithmeticException.class);
    calculator.divide(10, 0);
  }
}

Подробнее о ExpectedException см. в этой статье и JavaDoc ExpectedException

1 голос
/ 01 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...