在每个单元测试的@Before方法执行之前,我需要执行一些代码。问题是,我还需要知道哪些测试(名称足够)将在之后执行。在JUnit测试的@Before方法之前执行代码
我可以使用带字节码操作的AspectJ或Java代理来实现此目的。此外,解决方案应该适用于不存在@Before注释的测试。
任何想法?
编辑:我不能修改单元测试本身,因为我正在开发一个框架,用于执行其他项目
测试在每个单元测试的@Before方法执行之前,我需要执行一些代码。问题是,我还需要知道哪些测试(名称足够)将在之后执行。在JUnit测试的@Before方法之前执行代码
我可以使用带字节码操作的AspectJ或Java代理来实现此目的。此外,解决方案应该适用于不存在@Before注释的测试。
任何想法?
编辑:我不能修改单元测试本身,因为我正在开发一个框架,用于执行其他项目
测试你可能要考虑在JUnit中的测试名规则: http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestName.html
关于排序,解决方案可能是为您的测试定义超类,并在其中放入@Before,因为超类中的@Before方法在子类中的那些方法之前运行。
如果你想写一个Java代理,并且你没有绑定到Javassist或AspectJ,那么看看Byte Buddy这样做。
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与适当的清单的代码:该类型名称与Test
结束(作为一个例子)由可以在MyAdvice
类添加代码以与@Test
注释给出的任何方法并在运行之前进行注册。如果您在JDK上运行,则还可以使用byte-buddy-agent
项目以编程方式附加代理。
我忘了提及我不能修改单元测试本身。编辑问题 – user1839433
也许你可以实现你自己的JUnit Runner:http://junit.sourceforge.net/javadoc/org/junit/runner/Runner.html我不确定这个选项有多可行,因为测试可能会例如,想要使用MockitoJUnitRunner。 –
也想过这个,但后来我需要用instrumentation或AspectJ动态地替换正常的那个,而且我还没有研究过这个。我不允许对项目进行任何静态更改,所以我不能使用我自己修改的JUnit版本 – user1839433