2012-09-18 14 views
7

Ho un aspetto che viene eseguito dopo che un'eccezione è stata generata dal mio metodo di test TestNG. Vorrei ottenere il nome del metodo Test nel mio metodo aspectj.Come ottenere il nome del metodo che ha generato l'eccezione in Java

Qualche idea su questo? Si prega di trovare il mio codice di esempio qui sotto:

Aspetto:

pointcut publicCall(): call(public * *(..)); 

after() throwing (AssertionError e): publicCall() { 
    logger.debug("Assertion Error thrown"); 
    System.out.println("Threw an exception: " + e); 
} 

prova:

@Test 

public void testScenarioOne(){ 
    logger.debug("From Scenario One Test"); 
    Assert.assertEquals(true, false); 
} 

risposta

4

È necessario modificare il tipo di pointcut call-execution:

pointcut publicMethod(): execution(public * *(..)); 

after() throwing (AssertionError e): publicMethod() { 
    System.out.println(thisJoinPointStaticPart.getSignature()); 
} 

Edit: Forse sarebbe ancora più pulita per specificamente intercettare @Test metodi annotati:

import org.testng.annotations; 

public aspect TestExceptionInterceptor { 
    pointcut testMethod(): execution(@Test * *(..)); 

    after() throwing (AssertionError e): testMethod() { 
     System.out.println(thisJoinPointStaticPart.getSignature()); 
    } 
} 
+0

Grazie !!! La modifica del tipo pointcut dalla chiamata all'esecuzione ha funzionato. (il secondo snippet non è stato compilato). – rookie007r

+0

Per quanto mi ricordo, ho appena copiato e incollato il secondo snippet dal mio editor, dove è stato compilato bene. Può essere più preciso? Quale messaggio di errore ottieni? – kriegaex

+0

L'errore che hai ottenuto è probabile perché devi specificare il pacchetto completo come pointcut testMethod(): execution (@ org.testng.annotations.Test * * (..)); –

2

È possibile utilizzare:

thisJoinPoint.getSignature().getName() 

anche se si dovrà generare l'eccezione direttamente da il tuo metodo di prova Assert.equals() lancia l'eccezione non il metodo di prova.

+1

penso thisStaticJoinPoint sarebbe anche lavorare. –

+1

Beh ... Grazie! ma questo mi sta dando il metodo "assertEquels". Ho bisogno del metodo Test (es. TestScenarioOne). – rookie007r

Problemi correlati