限制具有特定注释的方法调用java方法
我正在为一些sftp验证编写测试,并运行一个嵌入式sftp服务器 所以我有一门课,比如:限制具有特定注释的方法调用java方法,java,annotations,testng,Java,Annotations,Testng,我正在为一些sftp验证编写测试,并运行一个嵌入式sftp服务器 所以我有一门课,比如: public class SftpServer { //method to initialize server public void init(){}; //method to stop server public void stop(){}; } 现在,由于我的测试在多线程环境中运行,我希望服务器只启动或停止一次,因此我使用TestNG作为单元测试框架 因此
public class SftpServer {
//method to initialize server
public void init(){};
//method to stop server
public void stop(){};
}
现在,由于我的测试在多线程环境中运行,我希望服务器只启动或停止一次,因此我使用TestNG
作为单元测试框架
因此,我希望
init
和stop
方法只能通过annotated
方法调用@BeforeSuite
或@AfterSuite
注释,我知道java文档可能是一种建议这样做的方法,但我希望强制执行它,在java中是否有可能以某种方式施加此限制?这可能不是做您想做的事情的最佳选择,但无论如何您都可以实现:
public void test() {
StackTraceElement element = getElement();
try {
Method m = Class.forName(element.getClassName()).getDeclaredMethod(element.getMethodName());
Annotation[] annotations = m.getAnnotations();
// do your thing
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static StackTraceElement getElement() {
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
for (int i = 1; i < elements.length; i++) {
StackTraceElement stackTraceElement = elements[i];
if (!stackTraceElement.getClassName().equals(Bar.class.getName())
&& !stackTraceElement.getMethodName().equals("getElement()")
&& stackTraceElement.getClassName().indexOf("java.lang.Thread") != 0) {
return stackTraceElement;
}
}
return null;
}
公共无效测试(){
StackTraceeElement元素=getElement();
试一试{
方法m=Class.forName(element.getClassName()).getDeclaredMethod(element.getMethodName());
Annotation[]annotations=m.getAnnotations();
//做你的事
}捕获(无此方法例外){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}
}
私有静态stackTraceeElement getElement(){
StackTraceElement[]元素=Thread.currentThread().getStackTrace();
for(int i=1;i
有了调用者方法的注释列表,只需查找您想要的注释列表并执行您必须执行的操作
认为调用方方法来自另一个类,所以将其调整到您的需要。
< P>有两种通用方法来执行。 一个是用于执行运行时检查的init
和stop
方法。调用时,它们将检查堆栈,确定调用方,反射地确定调用方上的注释,如果调用方未使用@BeforeSuite
或@AfterSuite
注释,则抛出异常。这并不能阻止您编写不正确的调用,如果您编写了不正确的调用,它只会使测试套件崩溃
另一种方法是静态检查。编译调用
init
或stop
的方法时,如果该方法未使用@BeforeSuite
或@AfterSuite
注释,编译器将发出错误。这会在编译时提前通知您错误,从而防止您运行错误代码。要实现这一点,您可以使用工具(如)或插件(如)编写注释处理器。No,注释只包含编译器的元信息,无法限制对方法的访问。如果不是正确的注释,则查找调用方法的注释类名并引发异常如何?找到调用方法并使用反射解析其注释:)我不知道是否有方法获取调用方法的注释类名没有标准的方法,所以它会涉及大量的黑客代码,但没有什么好处。