限制由具有特定注释的方法调用的java方法

时间:2016-04-05 08:44:42

标签: java annotations testng

我正在为一些sftp验证编写测试,并运行嵌入式sftp服务器。

所以我有一个类:

public class SftpServer {

    //method to initialize server
    public void init(){};

    //method to stop server
    public void stop(){};

   }

现在我的测试在多线程环境中运行,我希望服务器只启动或停止一次,我使用TestNG作为单元测试框架。

所以我希望只使用带有initstop注释的方法annotated来调用@BeforeSuite@AfterSuite方法,我知道java docs也许是一种建议以这种方式完成它的方法,但是我希望强制它,在java中是否有可能以某种方式强加这种限制?

2 个答案:

答案 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)

有两种常规方法可以强制执行此操作。

一个是initstop方法来执行运行时检查。调用时,它们将检查堆栈,确定其调用者,反射性地确定其调用者的注释,并在调用者没有注释@BeforeSuite@AfterSuite时抛出异常。这不会阻止您编写不正确的调用,如果您编写了错误的调用,它只会使您的测试套件崩溃。

另一种方法是静态检查。在编译调用initstop的方法时,如果未使用@BeforeSuite@AfterSuite注释方法,编译器将发出错误。这样可以在编译时提供错误的早期通知,从而防止您运行错误的代码。要实现这一点,您可以使用Checker Framework等工具或error-prone等工具编写注释处理器。