Ожидайте исключение или один из его подклассов в тесте Junit с использованием аннотации @Test - PullRequest
8 голосов
/ 10 января 2012

У меня есть тест, который ожидает конкретного исключения, например:

@Test(expected=MyException.class)
public void testMyMethod(){
    myMethod();
}

Метод myMethod() фактически выдает подкласс MyException, давайте назовем его MySubclassException.

Есть ли способ определить мой тест, используя аннотацию @Test для приема подклассов MyException, а также самого класса?

Я знаю, что мог бы сам написать логику проверки теста, не используя expected, перехватывая исключение и устанавливая флаг, но мне было интересно, поддерживает ли JUnit совпадающие подклассы исключений.

Ответы [ 3 ]

3 голосов
/ 10 января 2012

Тест пройдет, если myMethod() выброшено MyException или MySubclassException. Я проверил концепцию с этим кодом:

public class ExceptionTest {

    private static class ExceptionA extends Exception {

    }

    private static class ExceptionB extends ExceptionA {

    }

    @Test(expected=ExceptionA.class)
    public void test() throws Exception {
        throw new ExceptionB();
    }
}
3 голосов
/ 10 января 2012

Это уже обработано для вас фреймворком

Давайте рассмотрим небольшой пример (очень плохой код): импортировать статический org.junit.Assert. *;

import org.junit.Test;


public class TestExpect {

@Test(expected=MyException.class)
public void test() throws MyException {
    new Foo().foo();
}

}

С двумя классами исключений MyException и MyExtendedException, унаследованными от предыдущего, и простым классом Foo, подобным этому:

public class Foo {

public void foo() throws MyException{
    throw new MyExtendedException();
}
}

При запуске теста с использованием Eclipse Runner печатается зеленая полоса, потому что тест вызывает один экземпляр Myexception (это отношение в POO)

Если вы предпочитаете читать исходный код, это отрывок из исходного кода Junit (ExpectException.java):

   @Override
    public void evaluate() throws Exception {
        boolean complete = false;
        try {
            fNext.evaluate();
            complete = true;
        } catch (AssumptionViolatedException e) {
            throw e;
        } catch (Throwable e) {
            if (!fExpected.isAssignableFrom(e.getClass())) {
                String message= "Unexpected exception, expected<"
                            + fExpected.getName() + "> but was<"
                            + e.getClass().getName() + ">";
                throw new Exception(message, e);
            }
        }
        if (complete)
            throw new AssertionError("Expected exception: "
                    + fExpected.getName());
    }
0 голосов
/ 16 ноября 2013

BDD Стиль решения с Исключение улова

@Test
public void testMyMethod() {

    when(foo).myMethod();

    then(caughtException()).isInstanceOf(MyException.class);

}

1008 * Зависимость * com.googlecode.catch-exception:catch-exception:1.2.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...