2011-12-10 10 views
0

JUnit과 Javassist에 대한 이해가 매우 부족합니다. 프로그램 분석에 사용하고 싶습니다. 예를 들어 라이브러리가 주어진다면 런타임 중에 라이브러리의 어떤 메소드가 호출되었는지 알고 싶습니다. 바이트 코드 조작을 사용하여 system.out.println ("method_name");을 삽입 할 수 있습니다. 메소드의 시작 부분에있는 명령문. 그래서 런타임 중에 어떤 메소드가 호출되었는지를 출력 할 것이다.JUnit 테스트에서 Javassist 사용

독립 실행 형 응용 프로그램에서는 main()이 호출되기 전에 가로 채기가 가능하고 내 자신의 클래스 로더 (아래 참조)를 사용할 수 있지만 JUnit에서는 main()이 없으므로이 상황에서 가로채는 방법을 보여줄 수 있습니까? 많은 감사.

... 
    Loader loader = new Loader(pool); 
    loader.addTranslator(pool, xlat); 
    loader.run(className, args); 
... 

편집 : 나는 대신 다른 방법을 추천 할 수 있음의 JUnit 4.8와 Javassist 3.15.0.GA

답변

0

내가 사용? 대신에 AspectJ을 사용하여 aspect 지향 접근법을 사용할 수 있습니다. 이를 통해 모니터링하려는 일부 또는 모든 메소드 주위에 pointcut을 정의 할 수 있습니다.

또 다른 옵션은 코드 적용 범위 (JUnit을 사용하고 있으며 System.out.println(...)을 찾는 것이 좋습니다)를 모니터링하려는 경우 코드 도달 범위 도구를 찾고 있습니까? 그렇다면 Cobertura이 최선의 방법 일 것입니다. 맞춤 코딩이 필요하지 않습니다.

이 두 가지 옵션 모두 고유 한 바이트 코드 조작을 수행하지만 개발자가 유지 관리해야하는 것은 아닙니다.

Eclipse를 IDE로 사용하고 있다면이 두 가지가 Eclipse와 매우 잘 어울립니다. AspectJ는 실제로 Eclipse 프로젝트이지만 Eclipse는 필요하지 않습니다. Cobertura 용 Eclipse 플러그인은 eCobertura입니다.

또 다른 옵션은 JUnit 자체 내에서 수행하는 것입니다. 그러면 바이트 코드 조작이 필요하지 않습니다. 그것의 TestWatchman 클래스를보십시오. 나는 다른 도서관과 마찬가지로 온라인에서이 문서를 아직 작성하지 않았지만 내 JUnit utilities library의 일부로 내 BaseTest 클래스를 살펴볼 수 있습니다. 이것을 확장하는 JUnit 테스트 클래스는 각 테스트가 시작, 성공 또는 실패 할 때 자동으로 (SLF4J로) 기록합니다. 그러나 이것은 모두 테스트 수준에서만 수행되며 각 테스트가 실행되는 다른 방법을 모니터링하는 데 도움이되지 않습니다.

+0

입력 해 주셔서 감사합니다. – Mike

관련 문제