我正在为一些sftp验证编写测试,并运行嵌入式sftp服务器。
所以我有一个类:
public class SftpServer {
//method to initialize server
public void init(){};
//method to stop server
public void stop(){};
}
现在我的测试在多线程环境中运行,我希望服务器只启动或停止一次,我使用TestNG
作为单元测试框架。
所以我希望只使用带有init
或stop
注释的方法annotated
来调用@BeforeSuite
和@AfterSuite
方法,我知道java docs也许是一种建议以这种方式完成它的方法,但是我希望强制它,在java中是否有可能以某种方式强加这种限制?
答案 0 :(得分:0)
这可能不是做你想做的最好的选择,但无论如何你都能实现它:
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;
}
使用针对调用者方法的注释列表,只需查找您想要的注释列表并执行任何操作。
这考虑到调用者方法来自另一个类,因此请根据您的需要进行调整。
答案 1 :(得分:0)
有两种常规方法可以强制执行此操作。
一个是init
和stop
方法来执行运行时检查。调用时,它们将检查堆栈,确定其调用者,反射性地确定其调用者的注释,并在调用者没有注释@BeforeSuite
或@AfterSuite
时抛出异常。这不会阻止您编写不正确的调用,如果您编写了错误的调用,它只会使您的测试套件崩溃。
另一种方法是静态检查。在编译调用init
或stop
的方法时,如果未使用@BeforeSuite
或@AfterSuite
注释方法,编译器将发出错误。这样可以在编译时提供错误的早期通知,从而防止您运行错误的代码。要实现这一点,您可以使用Checker Framework等工具或error-prone等工具编写注释处理器。