我需要在执行每个单元测试的@Before方法之前执行一些代码。问题是我还需要知道之后将执行哪个测试(名称已足够)。
我可以使用带有字节码操作的AspectJ或Java代理来实现这一目的。此解决方案也适用于没有@Before注释的测试。
有什么想法吗?
编辑:我不能自己修改单元测试,因为我正在开发一个框架来执行其他项目的测试答案 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
项目以编程方式附加代理。