2016-10-01 345 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項目以編程方式附加代理。

相關問題