Выполнить код перед методом @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 в суперклассах запускаются раньше, чем в подклассах.