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

时间:2011-06-27 16:12:46

标签: java junit

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

进一步的变化:

    Class thisClass = new SecurityManager() {

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

    }.getCurrentClass();

这样做的好处是,您可以将SecurityManager与您正在使用它的类分开,即,您可以在某处只有一个实例,并使用它来获取有趣的反射元数据,包括此元数据。没有任何特殊的丑陋。普通SecurityManager无效的原因是getClassContextprotected

编辑:更多示例

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

另一个想法是查看堆栈跟踪,即 Thread.currentThread()。getStackTrace()[2] .getClassName()应该给你的名字 class,如果已复制静态方法。