在每個單元測試的@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