Возможно ли получить доступ к экземпляру исключения, "перехваченному" с помощью правила JUnit ExpectedException? - PullRequest
0 голосов
/ 28 января 2020

Предположим, что в тесте есть:

@Rule
public ExpectedException thrown = ExpectedException.none();

, а в каком-то тесте содержится:

thrown.expect(SomeNastyException.class);

Теперь, если есть необходимость проверить это SomeNastyException более подробно, что будет кстати?

Конечно, можно было бы просто не использовать ExcpectedException и обернуть вызов с помощью try / catch , а затем проверить исключение любым необходимым способом, но теперь вопрос о, это может быть сделано с ExpectedException, что-то вроде:

assertEquals("42", thrown.getException().getUniversalAnswerToEverything());

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Вы можете использовать hasProperty Hamcrest Matcher. И если ваше SomeNastyException не соответствует * bean-протоколу java, вы можете создать для вас исключение:

package stackoverflow.q59946794;

import org.hamcrest.Description;
import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.hamcrest.core.IsEqual;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import java.util.logging.Logger;

public class SomeNastyExceptionSpec {
    private final static Logger logger = Logger.getLogger(SomeNastyExceptionSpec.class.getName());

    public static class SomeNastyException extends Exception implements java.io.Serializable {
        SomeNastyException(String message) { super(message);}
        public Integer getUniversalAnswerToEverything() {return 42;}
    }

    public static Matcher<SomeNastyException> hasUniversalAnswerToEverythingFeature(final int expectedAnswer) {
        return new FeatureMatcher<SomeNastyException, Integer>(
                new IsEqual<Integer>(expectedAnswer),
                "SomeNastyException actual answer",
                "SomeNastyException expected answer"
        ) {
            @Override
            protected Integer featureValueOf(SomeNastyException actual) {
                return actual.getUniversalAnswerToEverything();
            }
        };

    }
    public static Matcher<SomeNastyException> hasUniversalAnswerToEverything(final int expectedAnswer) {
        return new TypeSafeMatcher<SomeNastyException>() {

            @Override
            protected void describeMismatchSafely(SomeNastyException e, Description description) {
                description.appendText("was ").appendValue(e.getUniversalAnswerToEverything());
            }

            @Override
            public void describeTo(Description description) {
                description.appendText("SomeNastyException with answer ").appendValue(expectedAnswer);
            }

            @Override
            protected boolean matchesSafely(SomeNastyException e) {
                return e.getUniversalAnswerToEverything() == expectedAnswer;
            }
        };
    }

    @Rule(order = Integer.MAX_VALUE)
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void shouldTestExceptionMessage() throws Exception {
        thrown.expect(SomeNastyException.class);
        thrown.expect(hasUniversalAnswerToEverything(42));
        thrown.expect(hasUniversalAnswerToEverythingFeature(42));
        thrown.expectMessage("always 42");
        throw new SomeNastyException("always 42");
    }
}

0 голосов
/ 28 января 2020

Существует менее специализированная версия метода expect в этом правиле, которая принимает совпадение Hamcrest:

Ожидайте (сопоставление)

Этот метод позволит Вы можете утверждать почти что-либо о сгенерированном исключении, при условии, что для этого есть реализация Matcher.

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

import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.Matchers.is;

....

exceptions.expect(hasProperty("UniversalAnswerToEverything", is(42)));

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

...