在Java中的静态方法中使用自己的类
我有几个junit测试用例,它们扩展了AbstractTest。它们都需要有一个静态方法在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
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()应该为您提供
类,如果已复制静态方法