我有几个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);
如果上述情况不可行,是否有其他方法可以至少标记此类错误?
答案 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
无效的原因是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);
}
}
答案 2 :(得分:1)
如果你不害怕真正的,非常丑陋的代码,请尝试:
Class thisClass = new Object() { }.getClass().getEnclosingClass();
return new junit.framework.JUnit4TestAdapter(thisClass);
答案 3 :(得分:0)
另一个想法是查看堆栈跟踪,即 Thread.currentThread()。getStackTrace()[2] .getClassName()应该给你的名字 class,如果已复制静态方法。