在JUnit测试的@before方法之前执行代码
在执行每个单元测试的@before方法之前,我需要执行一些代码。问题是,我还需要知道之后将执行哪个测试(名称足够) 我可以使用AspectJ或Java代理和字节码操作来实现这一点。该解决方案也适用于不存在@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方法是在子类中的方法
编辑:我无法修改单元测试本身,因为我正在开发一个用于执行其他项目测试的框架您可能希望查看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");
}
}