将自定义消息添加到JUnit4样式异常测试

时间:2010-12-01 17:02:47

标签: java exception junit message

我有以下测试:

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

here

如果此测试失败,我想添加一条将打印的消息。

例如,如果我正在进行断言测试,我会执行以下操作来添加消息:

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

第二个示例应该打印出“这是我想要打印的错误消息”。如何设置第一个示例消息文本?

4 个答案:

答案 0 :(得分:2)

也许@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 :(得分:1)

我认为你不能轻易做到,但this家伙似乎已经部分地解决了这个问题。

答案 2 :(得分:1)

我建议改为命名测试以明确测试测试的内容,因此当您的某些测试失败时,它们会告诉您问题是什么。以下是使用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的详细信息,请参阅this articlethe ExpectedException JavaDoc

答案 3 :(得分:1)

如果您愿意使用catch-exception而不是JUnit的内置异常处理机制,那么您的问题可以轻松解决:

catchException(myObj).doSomethingExceptional();
assertTrue("This is the error message I want printed.",
           caughtException() instanceof ArithmeticException);