Как проверить, что Assert выбрасывает исключение в Android - PullRequest
9 голосов
/ 26 сентября 2011

Есть ли более элегантный способ сделать исключение бросков assert в Android, чем этот?

public void testGetNonExistingKey() {   
        try {
            alarm.getValue("NotExistingValue");
            fail( );
        } catch (ElementNotFoundException e) {

        }
}

Как-то так не работает?!

    @Test(expected=ElementNotFoundException .class)

Спасибо, Марк

Ответы [ 4 ]

4 голосов
/ 26 сентября 2011

Вы используете тестовый запуск junit4?Аннотация @Test не будет работать, если вы используете тестовый запуск junit3.Проверьте версию, которую вы используете.

Во-вторых, рекомендуемый способ проверки исключений в вашем коде - это использование правила (введено в junit 4.7).

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

@Test
public void throwsIllegalArgumentExceptionIfIconIsNull() {
    // do something

    exception.expect(IllegalArgumentException.class);
    exception.expectMessage("Icon is null, not a file, or doesn't exist.");
    new DigitalAssetManager(null, null);
}

Вы можетепродолжайте использовать @Test (ожидается = IOException.class), но вышеописанное имеет то преимущество, что, если перед вызовом exception.expect выдается исключение, проверка завершится неудачей.

3 голосов
/ 24 марта 2013

Я сделал что-то очень похожее на ответ Хопии с парой улучшений.Я сделал так, чтобы он возвращал объект исключения, чтобы вы могли проверить его сообщение или любые другие свойства, и я объявил Testable интерфейс для замены Runnable, потому что Runnable не позволяет вашему тестируемому коду генерировать проверенные исключения.

public interface Testable {
    public void run() throws Exception;
}

public <T extends Exception> T assertThrows(
        final Class<T> expected, 
        final Testable codeUnderTest) throws Exception {
    T result = null;
    try {
        codeUnderTest.run();
        fail("Expecting exception but none was thrown.");
    } catch(final Exception actual) {
        if (expected.isInstance(actual)) {
            result = expected.cast(actual);
        }
        else {
            throw actual;
        }
    }
    return result;
}

Вот пример его вызова.

InvalidWordException ex = assertThrows(
    InvalidWordException.class,
    new Testable() {
        @Override
        public void run() throws Exception {
            model.makeWord("FORG", player2);
        }
    });

assertEquals(
        "message", 
        "FORG is not in the dictionary.", 
        ex.getMessage());
2 голосов
/ 09 мая 2012

Вот как я это делаю.Я создаю статический метод assertThrowsException, который принимает в качестве аргументов ожидаемый класс исключений и Runnable, который содержит тестируемый код.

import junit.framework.Assert;

public SpecialAsserts {
    public void assertThrowsException(final Class<? extends Exception> expected, final Runnable codeUnderTest) {
        try {
            codeUnderTest.run();
            Assert.fail("Expecting exception but none was thrown.");
        } catch(final Throwable result) {
            if (!expected.isInstance(result)) {
                Assert.fail("Exception was thrown was unexpected.");
            }
        }
    }
}

Это пример кода для использования специального утверждения в вашем тестовом классе (который расширяет AndroidTestCase или один из его производных):

public void testShouldThrowInvalidParameterException() {

    SpecialAsserts.assertThrowsException(InvalidParameterException.class, new Runnable() {
        public void run() {
            callFuncThatShouldThrow();
        }
    });

}

Да, есть много работы, но это лучше, чем портировать junit4 на Android.

0 голосов
/ 25 июня 2015

С junit3 может помочь следующее.

public static void assertThrows(Class<? extends Throwable> expected,
        Runnable runnable) {
    try {
        runnable.run();
    } catch (Throwable t) {
        if (!expected.isInstance(t)) {
            Assert.fail("Unexpected Throwable thrown.");
        }
        return;
    }
    Assert.fail("Expecting thrown Throwable but none thrown.");
}

public static void assertNoThrow(Runnable runnable) {
    try {
        runnable.run();
    } catch (Throwable t) {
        Assert.fail("Throwable was unexpectedly thrown.");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...