2014-02-12 2 views
2

aspectj maven plugin을 사용하여 컴파일 타임에 Aspect를 만듭니다. 응용 프로그램을 실행할 때 @Advice 주석이있는 클래스가 처음 조언을 호출하기 직전에 인스턴스화됩니다. 예를 들면 : 나는 @Timed 주석을 사용하는 방법이있는 경우단위 테스트 컴파일 시간

@Aspect 
public class MyAdviceClass { 

    public MyAdviceClass() { 
     System.out.println("creating MyAdviceClass"); 
    } 

    @Around("execution(* *(..)) && @annotation(timed)") 
    public Object doBasicProfiling(ProceedingJoinPoint pjp, Timed timed) throws Throwable { 
     System.out.println("timed annotation called"); 
     return pjp.proceed(); 
    } 
} 

는 "창조 MyAdviceClass는"메소드가 호출되고 "라는 시간 제한 주석이"때마다 인쇄됩니다 처음으로 인쇄됩니다.

MyAdviceClass에있는 일부 구성 요소를 조롱하여 조언 기능을 단위 테스트하고 싶습니다. 그러나 MyAdviceClass은 AspectJ에 의해 Spring Bean이 아닌 인스턴스화되기 때문에 이렇게 할 수 없습니다.

단위 테스트를위한 최선의 방법은 다음과 같습니다.

+0

일반적으로 단위 테스트에는 외부 종속성 조롱이 포함되지만 아무 것도 표시되지 않습니다. 외부 의존성을 조롱하고 싶습니까? 아니면 조언을 조롱하고 싶습니까? – Taylor

+0

생성자를 사용하여'MyAdviceClass' 인스턴스를 생성하고,'ProceedingJoinPoint'와'Timed'에 mock을 사용합니까? –

+0

@Taylor, 나는 그들을 단순화하기 위해 제외시켰다. @RC., 당신은 그런 식으로'doBasicProfiling' 메소드를 테스트 할 수 있다고 정확합니다.하지만 주석이 달린 메소드를 실행할 때 advice가 호출되는지 테스트하고 싶습니다. – tgrosinger

답변

0

나는 해결책을 찾았으며 이것을 만난 다른 누구에게도 게시하고 싶습니다. 이 트릭은 봄용 bean 정의에서 factory-method="aspectOf"을 사용하고있다. 따라서 위의 예를 사용하여, 나는 이런 모양 일 내 applicationContext.xml

<bean class="com.my.package.MyAdviceClass" factory-method="aspectOf"/> 

모든 내 단위 테스트에이 줄을 추가합니다 :

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml") 
public class MyAdviceClassTest { 
    @Autowired private MyAdviceClass advice; 
    @Mock private MyExternalResource resource; 

    @Before 
    public void setUp() throws Exception { 
     initMocks(this); 
     advice.setResource(resource); 
    } 

    @Test 
    public void featureTest() { 
     // Perform testing 
    } 
} 

자세한 내용은 here 사용할 수 있습니다.