Search code examples
groovygeb

Groovy get current methods annotation


I created a java interface for my annotation. I am now writing a geb spock test and I would like to print the annotation values so it shows in the gradle report. Is this possible? Here is my test case and let me know if I am doing this wrong

class Checkout extends GebReportingSpec {

    @TestCase(someID="12345")
    def "A checkout 3-D script"() {
        // My test steps.....
    }
}

Solution

  • Use StackTraceUtils.sanitize to get the current method and use reflection to iterate through the annotations:

    import java.lang.annotation.*
    
    import org.codehaus.groovy.runtime.StackTraceUtils
    
    class Checkout {
      @TestCase(someID="12345")
      def "yeah a"() {
        printTestCaseId()
        // My test steps.....
      }
    
      def printTestCaseId() {
        def stack = StackTraceUtils.sanitize(new Throwable()).stackTrace[1]
        def method = getClass().declaredMethods.find { it.name == stack.methodName }
        println method
        def someID = method.annotations[0].someID()
        println someID
        assert someID == "12345"
      }
    
    }
    
    @Retention (RetentionPolicy.RUNTIME)
    @interface TestCase { String someID() }
    
    co = new Checkout()
    co."${'yeah a'}"()
    

    The StackTraceUtils is not needed if you are the one iterating through the methods.