我有以下测试:
@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);
}
第二个示例应该打印出“这是我想要打印的错误消息”。如何设置第一个示例消息文本?
答案 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 article和the ExpectedException JavaDoc
答案 3 :(得分:1)
如果您愿意使用catch-exception而不是JUnit的内置异常处理机制,那么您的问题可以轻松解决:
catchException(myObj).doSomethingExceptional();
assertTrue("This is the error message I want printed.",
caughtException() instanceof ArithmeticException);