簡體   English   中英

在Java的靜態方法中使用自己的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM