Перехват функций JUnit Assert - PullRequest
5 голосов
/ 24 марта 2011

Я хотел бы сделать что-то «свое», когда утверждение в JUnit не выполняется. Я хотел бы иметь это:

public class MyAssert extends org.junit.Assert {

    // @Override
    static public void fail(String message) {
        System.err.println("I am intercepting here!");
        org.junit.Assert.fail(message);
    }
}

Конечно, это не работает, потому что вы не можете переопределить статические методы. Но если бы это было так, это было бы хорошо, потому что каждая функция assert, такая как assertTrue(), вызывает метод fail(). Таким образом, я мог легко перехватить каждое утверждение.

Существует ли какой-либо способ сделать то, что я хочу сделать здесь, без реализации всех различных разновидностей assert...?

Ответы [ 3 ]

4 голосов
/ 25 марта 2011

Вы должны взглянуть на правила, которые были введены в Junit 4.7.Особенно TestWatchman:

TestWatchman - это базовый класс для правил, которые принимают к сведению действие тестирования, не изменяя его.Например, этот класс будет вести журнал каждого пройденного и не пройденного теста:

http://junit -team.github.io / junit / javadoc / 4.10 / org / junit / rules / TestWatchman.html

Это позволяет вам определить MethodRule, который может обрабатывать неудачные тесты (Копировать из javadoc):

   @Rule
    public MethodRule watchman= new TestWatchman() {
            @Override
            public void failed(Throwable e, FrameworkMethod method) {
                    watchedLog+= method.getName() + " " + e.getClass().getSimpleName()
                                    + "\n";
            }

            @Override
            public void succeeded(FrameworkMethod method) {
                    watchedLog+= method.getName() + " " + "success!\n";
            }
    };

    @Test
    public void fails() {
            fail();
    }

    @Test
    public void succeeds() {
    }

Согласно комментарию TestWatchman отменяется в более новых версиях Junit и заменяется наTestWatcher (но функциональность та же):

http://junit -team.github.io / junit / javadoc / 4.10 / org / junit / rules / TestWatcher.html

1 голос
/ 25 марта 2011

Вы можете написать класс, который реализует одинаковые сигнатуры всех методов в Assert, а затем делегировать методы Assert.

public class MyAssert {
    static public void assertTrue(String message, boolean condition) {
        Assert.assertTrue(message, condition);
    }

    ...

    static public void fail(String message) {
        System.err.println("I am intercepting here!");
        Assert.fail(message);
    }
}

Не совсем повторная реализация всех методов, но, тем не менее, утомительно. Ваша IDE может помочь в создании методов делегата.

0 голосов
/ 16 августа 2013

Для индивидуальных утверждений вы можете перехватить AssertionError - у меня работает следующее.Это полезно, когда вам нужны только функциональные возможности.

try {
    Assert.assertEquals("size", classes.length, containerList.size());
} catch (AssertionError e) {
    System.err.println("ERROR");
    for (AbstractContainer container : containerList) {
        System.err.println(container.getClass());
    }
    throw (new RuntimeException("Failed", e));
}
...