繁体   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