2016-10-01 83 views
1

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

我可以使用带字节码操作的AspectJ或Java代理来实现此目的。此外,解决方案应该适用于不存在@Before注释的测试。

任何想法?

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

测试

回答

0

你可能要考虑在JUnit中的测试名规则: http://junit.org/junit4/javadoc/4.12/org/junit/rules/TestName.html

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

+0

我忘了提及我不能修改单元测试本身。编辑问题 – user1839433

+0

也许你可以实现你自己的JUnit Runner:http://junit.sourceforge.net/javadoc/org/junit/runner/Runner.html我不确定这个选项有多可行,因为测试可能会例如,想要使用MockitoJUnitRunner。 –

+0

也想过这个,但后来我需要用instrumentation或AspectJ动态地替换正常的那个,而且我还没有研究过这个。我不允许对项目进行任何静态更改,所以我不能使用我自己修改的JUnit版本 – user1839433

0

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

相关问题