[英]use its own class in a static method in Java
我有幾個junit測試用例,它們擴展了AbstractTest。 它們都必須具有靜態方法suite()
。 但是,人們通常會復制並粘貼舊的測試用例以創建新的用例,而最終忘記將舊的OtherTest.class
更改為新的TestA.class
。 這很不好,因為新的測試將無法運行,並且由於沒有編譯錯誤,因此很難檢測到。
public class TestA{
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(
OtherTest.class);// Should be TestA.class
}
}
有沒有辦法寫像
return new junit.framework.JUnit4TestAdapter(this);
如果上述方法不可行,是否還有其他方法至少可以標記這種類型的錯誤?
@Killian Foth建議的變體是:
public static junit.framework.Test suite() {
class Inner {} // to get a handle on this class
return new junit.framework.JUnit4TestAdapter(
Inner.class.getEnclosingClass());
}
進一步的變化:
Class thisClass = new SecurityManager() {
public Class getCurrentClass() {
return getClassContext()[1];
}
}.getCurrentClass();
這樣做的好處是,您可以將SecurityManager與使用它的類分開,即,您只能在某個位置擁有一個實例,並使用它來獲取有趣的反射元數據,包括該元數據。 沒有任何特別的丑陋之處。 普通SecurityManager
在這里不起作用的原因是getClassContext
protected
。
編輯:進一步的例子
public class ClassUtil extends SecurityManager {
public static Class getCurrentClass() {
return getClassContext()[1];
}
}
public class TestA {
private static thisClass = ClassUtil.getCurrentClass();
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(thisClass);
}
}
public class TestB {
private static thisClass = ClassUtil.getCurrentClass();
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(thisClass);
}
}
如果您不害怕真正非常丑陋的代碼,請嘗試:
Class thisClass = new Object() { }.getClass().getEnclosingClass();
return new junit.framework.JUnit4TestAdapter(thisClass);
另一個想法是查看堆棧跟蹤,即,如果已復制靜態方法,則Thread.currentThread()。getStackTrace()[2] .getClassName()應該為您提供類的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.