Я предполагаю, что вы хотите, чтобы тест прошел, если ваше утверждение не выполнено, но если подтверждение выполнено успешно, тест также должен пройти.
Самый простой способ сделать это - использовать TestRule .TestRule дает возможность выполнить код до и после запуска тестового метода.Вот пример:
public class ExpectedFailureTest {
public class ExpectedFailure implements TestRule {
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
base.evaluate();
} catch (Throwable e) {
if (description.getAnnotation(Deprecated.class) != null) {
// you can do whatever you like here.
System.err.println("test failed, but that's ok:");
} else {
throw e;
}
}
}
};
}
}
@Rule public ExpectedFailure expectedFailure = new ExpectedFailure();
// actually fails, but we catch the exception and make the test pass.
@Deprecated
@Test public void testExpectedFailure() {
Object o = null;
o.equals("foo");
}
// fails
@Test public void testExpectedFailure2() {
Object o = null;
o.equals("foo");
}
}
Во-первых, обратите внимание, что первый метод помечен как @Deprecated
.Я использую это как маркер для метода, для которого я хочу игнорировать любые ошибки утверждения.Вы можете делать все, что захотите, чтобы определить методы, это всего лишь пример.
Далее, в ExpectedFailure#apply()
, когда я делаю base.evaluate (), я ловлю любой Throwable (который включает в себяAssertionError), и если метод помечен аннотацией @Deprecated, я игнорирую ошибку.Вы можете выполнить любую логику, какую захотите, чтобы решить, следует ли игнорировать ошибку или нет, основываясь на номере версии, некотором тексте и т. Д. Вы также можете передать динамически определенный флаг в ExpectedFailure, чтобы он не работал для определенных номеров версий:
public void unmarshalledDocumentHasExpectedValue() {
doc = unmarshaller.unmarshal(getResourceAsStream("mydoc.xml"));
expectedFailure.setExpectedFailure(doc.getVersionNumber() < 3000);
final ST title = doc.getTitle();
assertThat(doc.getTitle().toStringContent(), equalTo("Expected"));
}
Дополнительные примеры см. В ExternalResource и ExpectedException
Игнорирование теста ожидаемого сбоя вместо его прохождения
ЕслиЕсли вы хотите пометить ваши тесты как «Пропущенные», а не как «Успешные», они становятся немного более сложными, потому что тесты игнорируются перед их выполнением, поэтому вам необходимо ретроспективно пометить тест как пропущенный, что потребует создания собственного Runner.Для начала, смотрите мой ответ на Как определить правило метода JUnit в комплекте? .Или задайте другой вопрос.