Как запустить некоторый код перед каждым методом JUnit @Test индивидуально, без использования @RunWith или AOP? - PullRequest
4 голосов
/ 23 ноября 2011
Сценарий использования

прост: я хочу запустить некоторый код рабочей пластины перед каждым методом в тесте JUnit с аннотациями @Test и моей пользовательской аннотации (назовем его @Mine).

Я не хочу использовать следующие методы (объяснение в скобках):

  1. @ RunWith (мой тест может или не может использовать эту аннотацию уже,поэтому я не могу предположить, что смогу использовать свой собственный бегун)
  2. AOP (я не могу устанавливать какие-либо зависимости от сторонних библиотек, таких как AspectJ)

Полагаю, это оставляет меня только для размышления, что мне подходит.Я размышлял об использовании @Before, сопровождаемом получением текущего метода через Thread.getCurrentThread () и т. Д., Но каким-то образом я нахожу это решение немного грязным, поскольку мне пришлось бы снова создать код котельной пластины в этом методе для запуска отражения (иВо-первых, целью было избежать ненужного кода).

Может быть, у вас есть другие идеи?

Ответы [ 2 ]

11 голосов
/ 23 ноября 2011

Вам нужно решение, очень похожее на ответ на Пометить юнит-тест как ожидаемый сбой , основываясь на TestRule .Используя пример аннотации @Deprecated (вы можете использовать свою здесь), вы можете вставить код, если аннотация существует для метода.Класс Description содержит список аннотаций для метода.

public class ExecutionTest {
    public class BeforeExecution 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 {
                    if (description.getAnnotation(Deprecated.class) != null) {
                        // you can do whatever you like here.
                        System.err.println("this will be run when the method has an @Deprecated annotation");
                    }
                    base.evaluate();
                }
            };
        }
    }

    @Rule public BeforeExecution beforeExecution = new BeforeExecution();

    // Will have code executed.
    @Deprecated
    @Test public void test1() {
         // stuff
    }

    // won't have code executed.
    @Test public void test2() {
         // stuff
    }
}
2 голосов
/ 23 ноября 2011

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

Затем используйте @before как обычно.

Это не добавляет ни одного стандартного кода и будет легко понять и поддерживатьи для будущих разработчиков.

...