Выполнить код перед методом @Before для теста JUnit

Мне нужно выполнить некоторый код перед выполнением метода @Before каждого модульного теста. Проблема в том, что мне также нужно знать, какой тест (достаточно имени) будет выполнен позже.

Я могу использовать AspectJ или Java-агенты с манипулированием байт-кодом для достижения этой цели. Также решение должно работать для тестов, где нет аннотации @Before.

Есть идеи?

РЕДАКТИРОВАТЬ: я не могу изменить сами модульные тесты, так как я разрабатываю среду для выполнения тестов других проектов

2 ответа

Если вы хотите написать Java-агент и не связаны с Javassist или AspectJ, посмотрите на Byte Buddy. Вы можете добавить код в MyAdvice класс для любого метода с аннотацией @Test учитывая, что имя типа заканчивается Test (в качестве примера)

public class MyAgent {
  public static void premain(String arg, Instrumentation inst) {
    new AgentBuilder.Default()
    .type(nameEndsWith("Test"))
    .transform((type, cl, builder) -> builder.visit(Advice
        .to(MyAdvice.class)
        .on(isAnnotatedWith(Test.class)))
    .installOn(instrumentation);
  }
}

class MyAdvice {
  @Advice.OnMethodEnter
  static void enter() {
    System.out.println("foo");
  }
}

Просто свяжите приведенный выше код с Javaagent с соответствующим кодом манифеста и зарегистрируйте его перед запуском. Если вы работаете в JDK, вы также можете подключить агента программно, используя byte-buddy-agent проект.

Возможно, вы захотите изучить правило TestName в JUnit: http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestName.html

Что касается упорядочения, решение может состоять в том, чтобы определить суперкласс для ваших тестов и поместить туда @Before, так как методы @Before в суперклассах запускаются раньше, чем в подклассах.

Другие вопросы по тегам