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