在Java中的静态方法中使用自己的类

在Java中的静态方法中使用自己的类,java,junit,Java,Junit,我有几个junit测试用例,它们扩展了AbstractTest。它们都需要有一个静态方法suite()。然而,人们通常复制并粘贴旧的测试用例来创建新的测试用例,结果忘记将旧的OtherTest.class更改为新的TestA.class。这是不好的,因为新的测试将不会运行,而且很难检测到,因为没有编译错误 public class TestA{ public static junit.framework.Test suite() { return new junit.framew

我有几个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);

如果上述方法不可行,是否有其他方法至少可以标记此类错误?

如果您不害怕非常非常难看的代码,请尝试:

Class thisClass = new Object() { }.getClass().getEnclosingClass();
return new junit.framework.JUnit4TestAdapter(thisClass);

如果您不害怕非常非常丑陋的代码,请尝试:

Class thisClass = new Object() { }.getClass().getEnclosingClass();
return new junit.framework.JUnit4TestAdapter(thisClass);

@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());
}

@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
受到
保护

编辑:进一步示例

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 SecurityManager() {

        public Class getCurrentClass() {
            return getClassContext()[1];
        }

    }.getCurrentClass();
这样做的好处是,您可以将SecurityManager与正在使用它的类分开,也就是说,您可以在某个地方只有一个实例,并使用它来获取有趣的反射元数据,包括这一个。没有任何特别的丑陋。普通的
SecurityManager
在这里不起作用的原因是
getClassContext
受到
保护

编辑:进一步示例

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);
    }
}

另一个想法是查看堆栈跟踪,即。 Thread.currentThread().getStackTrace()[2].getClassName()应该为您提供
类,如果静态方法已被复制。

另一个想法是查看堆栈跟踪,即。 Thread.currentThread().getStackTrace()[2].getClassName()应该为您提供 类,如果已复制静态方法