У Raystorm был хороший ответ. Я тоже не большой поклонник Правил. Я делаю что-то подобное, за исключением того, что я создаю следующий класс утилиты, чтобы облегчить читаемость и удобство использования, что является одним из больших плюсов аннотаций в первую очередь.
Добавить эту утилиту класс:
import org.junit.Assert;
public abstract class ExpectedRuntimeExceptionAsserter {
private String expectedExceptionMessage;
public ExpectedRuntimeExceptionAsserter(String expectedExceptionMessage) {
this.expectedExceptionMessage = expectedExceptionMessage;
}
public final void run(){
try{
expectException();
Assert.fail(String.format("Expected a RuntimeException '%s'", expectedExceptionMessage));
} catch (RuntimeException e){
Assert.assertEquals("RuntimeException caught, but unexpected message", expectedExceptionMessage, e.getMessage());
}
}
protected abstract void expectException();
}
Тогда для моего модульного тестирования, все, что мне нужно это код:
@Test
public void verifyAnonymousUserCantAccessPrivilegedResourceTest(){
new ExpectedRuntimeExceptionAsserter("anonymous user can't access privileged resource"){
@Override
protected void expectException() {
throw new RuntimeException("anonymous user can't access privileged resource");
}
}.run(); //passes test; expected exception is caught, and this @Test returns normally as "Passed"
}
Теперь, когда я думаю об этом немного больше ... Вы уверены, что это хорошая идея, чтобы утверждать это сообщение? Ваш вопрос заставлял меня копаться в исходном коде junit, и, похоже, они могли легко добавить эту функцию. Тот факт, что они делали * не *, заставляет меня думать, что это не может считаться хорошей практикой. Почему в вашем проекте важно утверждать это сообщение? –
Хороший вопрос. Скажите, что метод, содержащий 15 строк кода, вызывает одно и то же исключение из двух разных мест. В моих тестовых случаях нужно утверждать не только класс исключения, но и сообщение в нем. В идеальном мире любое ненормальное поведение должно иметь свое собственное исключение. Если бы это было так, мой вопрос никогда не возникнет, но производственные приложения не имеют своего уникального пользовательского исключения для каждого ненормального поведения. – Cshah