在JUnit测试的@before方法之前执行代码

在JUnit测试的@before方法之前执行代码,junit,aspectj,java-bytecode-asm,javassist,javaagents,Junit,Aspectj,Java Bytecode Asm,Javassist,Javaagents,在执行每个单元测试的@before方法之前,我需要执行一些代码。问题是,我还需要知道之后将执行哪个测试(名称足够) 我可以使用AspectJ或Java代理和字节码操作来实现这一点。该解决方案也适用于不存在@Before注释的测试 有什么想法吗 编辑:我无法修改单元测试本身,因为我正在开发一个用于执行其他项目测试的框架您可能希望查看JUnit中的TestName规则: 关于排序,一个解决方案可能是为您的测试定义一个超类,并在其中放一个@Before,因为超类中的@Before方法是在子类中的方法

在执行每个单元测试的@before方法之前,我需要执行一些代码。问题是,我还需要知道之后将执行哪个测试(名称足够)

我可以使用AspectJ或Java代理和字节码操作来实现这一点。该解决方案也适用于不存在@Before注释的测试

有什么想法吗


编辑:我无法修改单元测试本身,因为我正在开发一个用于执行其他项目测试的框架

您可能希望查看JUnit中的TestName规则:


关于排序,一个解决方案可能是为您的测试定义一个超类,并在其中放一个@Before,因为超类中的@Before方法是在子类中的方法之前运行的。

您可能需要查看JUnit中的TestName规则:


关于排序,一个解决方案可能是为您的测试定义一个超类,并在其中放一个@Before,因为超类中的@Before方法是在子类中的方法之前运行的。

如果您想编写Java代理,并且您不必绑定到Javassist或AspectJ,请查看如何执行此操作。您可以将
MyAdvice
类中的代码添加到使用
@Test
注释的任何方法中,前提是类型名称以
Test
结尾(例如),方法如下:


只需将上述代码与适当的清单代码绑定到Javaagent,并在运行之前注册它。如果您在JDK上运行,还可以使用
byte buddy agent
项目以编程方式附加代理。

如果您想编写Java代理,并且没有绑定到Javassist或AspectJ,请查看如何执行此操作。您可以将
MyAdvice
类中的代码添加到使用
@Test
注释的任何方法中,前提是类型名称以
Test
结尾(例如),方法如下:


只需将上述代码与适当的清单代码绑定到Javaagent,并在运行之前注册它。如果您在JDK上运行,还可以使用
byte buddy agent
项目以编程方式附加代理。

我忘了提到我不能修改单元测试本身。我会编辑这个问题也许你可以实现你自己的JUnit Runner:我不确定这个选项有多可行,因为测试可能想使用MockitoJUnitRunner。我也考虑过这个问题,但是我需要用instrumentation或AspectJ动态地替换普通的JUnitRunner,我还没有研究过这个问题。我不允许对项目进行任何静态更改,因此我不能使用我自己修改的JUnit版本。我忘了提到我不能修改单元测试本身。我会编辑这个问题也许你可以实现你自己的JUnit Runner:我不确定这个选项有多可行,因为测试可能想使用MockitoJUnitRunner。我也考虑过这个问题,但是我需要用instrumentation或AspectJ动态地替换普通的JUnitRunner,我还没有研究过这个问题。我不允许对项目进行任何静态更改,因此我不能使用自己修改的JUnit版本
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");
  }
}