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

时间:2016-10-01 08:40:52

标签: junit aspectj java-bytecode-asm javassist javaagents

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

我可以使用带有字节码操作的AspectJ或Java代理来实现这一目的。此解决方案也适用于没有@Before注释的测试。

有什么想法吗?

编辑:我不能自己修改单元测试,因为我正在开发一个框架来执行其他项目的测试

2 个答案:

答案 0 :(得分:0)

您可能希望在JUnit中查看TestName规则: http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestName.html

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

答案 1 :(得分:0)

如果您想编写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项目以编程方式附加代理。