2012-09-18 3 views
7

TestNG 테스트 메서드에서 예외가 throw 된 후에 실행되는 aspect가 있습니다. 내 aspectj 메서드에 Test 메서드 이름을 가져오고 싶습니다.Java에서 예외를 throw 한 메서드 이름을 얻는 방법

이 문제에 대한 의견이 있으십니까? 아래에있는 내 코드 샘플을 찾아주세요 :

측면 :

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

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

테스트 :

@Test 

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

답변

4
당신은 call에서 execution에 포인트 컷 유형을 변경해야

:

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

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

편집 : 어쩌면 심지어 청소기 것에 특별히 @Test 주석 방법을 가로채는 :

import org.testng.annotations; 

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

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

감사합니다 !!! pointcut 유형을 호출에서 실행으로 변경하는 것이 트릭을 만들었습니다. (두 번째 스 니펫은 컴파일되지 않았다.) – rookie007r

+0

내가 아는 한, 편집 된 두 번째 발췌 문장을 복사하여 붙여 넣기 만하면됩니다. 더 자세하게 얘기해 주 시겠어요? 어떤 오류 메시지가 나타 납니까? – kriegaex

+0

pointcut testMethod()와 같이 정규화 된 패키지를 지정해야하기 때문에 오류가 발생했을 수 있습니다. execute (@ org.testng.annotations.Test * * (..)); –

2

당신은 사용할 수 있습니다

thisJoinPoint.getSignature().getName() 

당신이 직접 예외를 던질 것입니다 있지만, 당신의 시험 방법. Assert.equals()은 테스트 방법이 아닌 예외를 던지고 있습니다.

+1

나는 thisStaticJoinPoint는 것 같아 또한 일한다. –

+1

음 ... 고맙습니다! 그러나 그것은 저에게 "assertEquels"방법을 제공합니다. Test 메서드 (예 : testScenarioOne)가 필요합니다. – rookie007r

관련 문제