2013-07-14 31 views
9

Tôi đã theo dõi gần như tất cả các câu hỏi của JUnit + Maven + AspectJ ở đây và thậm chí tôi khá chắc chắn rằng tôi đã thiết lập mọi thứ đúng cách, tôi không thể kiểm tra nó.AspectJ + Junit + Maven - pointcut được công nhận trong các bài kiểm tra nhưng NoSuchMethodError: aspectOf() exception ném

Tôi có một mô-đun Maven chỉ với một khía cạnh:

@Aspect 
public class AssertionAspect { 

    @Pointcut("execution(@org.junit.Test * *())") 
    public void testMethodEntryPoint() {} 

    @Before("testMethodEntryPoint()") 
    public void executeBeforeEnteringTestMethod() { 
     System.out.println("EXECUTE ACTION BEFORE ENTERING TEST METHOD"); 
    } 

    @After("testMethodEntryPoint()") 
    public void executeAfterEnteringTestMethod() { 
     System.out.println("EXECUTE ACTION AFTER ENTERING TEST METHOD"); 
    } 
} 

Rất khá đơn giản. Tất cả những gì tôi muốn làm là làm điều gì đó trước và sau mỗi lần thực hiện bất kỳ phương pháp thử nào trong dự án thử nghiệm của tôi, được chú thích với @Test.

Bây giờ, tôi đang sử dụng aspectj-maven-plugin trong <build> của tôi như thế này:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>aspectj-maven-plugin</artifactId> 
     <version>1.4</version> 
     <configuration> 
     <aspectLibraries> 
      <aspectLibrary> 
      <groupId>my.package</groupId> 
      <artifactId>with-aspects</artifactId> 
      </aspectLibrary> 
     </aspectLibraries> 
     <source>1.6</source> 
     <target>1.6</target> 
     </configuration> 
     <executions> 
     <execution> 
      <goals> 
      <goal>test-compile</goal> 
      </goals> 
      <configuration> 
      <showWeaveInfo>true</showWeaveInfo> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

1) Tôi không có mục tiêu compile trong <execution> vì tôi không có lớp học trong src/main/java (đó là sự thật và nó là ok, tôi biết những gì tôi đang làm)

2) tôi có

<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.7.3</version> 
</dependency> 
<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.7.3</version> 
</dependency> 

trong <dependencies> secti của tôi trên. Không có gì liên quan đến aspectj.

3) Tôi chắc chắn rằng các lớp thử nghiệm của tôi được công nhận bởi aspectj vì tôi thấy rằng các điểm tham gia đã được thông báo. Tôi thấy:

Join point 'method-execution(xyz)' in Type 'blabla' 
(AppTestCase.java:124) advised by before advice from 
'blabla' (my-aspects jar.jar!AssertionAspect.class(from AssertionAspect.java)) 

Giữ nguyên sau khi được tư vấn.

4) khi tôi thử phiên bản 1.7.3 thay vì 1.6.11, thông báo này xuất hiện với tôi trong khi điểm tham gia đã được xử lý: expected 1.6.11 found 1.7.3. Tôi đoán đó là một thông điệp từ aspectj-maven-plugin của phiên bản 1.4, tôi không thực sự biết khi nào 1.5 sẽ được phát hành để loại bỏ điều này. Phiên bản nào tương thích?

5) "mã" của tôi trông như thế này :)

@RunWith(JUnit4.class) 
public class TestClass() { 

    @Test 
    public void test01(){ 
    } 
} 

6) Tôi đã 1.6.0_39 biên dịch Oracle Java, Tôi đang biên soạn tất cả mọi thứ với 1,6 (mục tiêu, nguồn .. tất cả)

Vì vậy, các khía cạnh công nhận, áp dụng, tôi sẽ thực hiện kiểm tra như mvn clean test nhưng tất cả tôi nhận được là:

java.lang.NoSuchMethodError: 
my/aspect/AssertionAspect.aspectOf()Lmy/aspect/AssertionAspect; 

và khá dài stacktrace.

Tôi không có bất kỳ số nào đầu mối những gì có thể sai, thực sự.

+0

là nó hoạt động cho java 8? –

Trả lời

9

Vì vậy, các trick là để biên dịch thư viện mà với các khía cạnh của tôi không phải với javac nhưng với ajc (aka AspectJ-maven-plugin)

Vậy là xong. Tôi chỉ cần thêm phần này vào mô-đun maven với các khía cạnh (chúng nằm trong src/main/java)

Các khía cạnh là chú thích được gắn để bạn phải có 1.6 nguồn/đích/tuân thủ mức

AspectJ PHẦN

<!-- Build --> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.4</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
       <complianceLevel>1.6</complianceLevel> 
       <verbose>true</verbose> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
      </dependencies> 
     </plugin> 
    </plugins> 
</build> 

hơn bạn phải thêm module này như một sự phụ thuộc kiểm tra vào mô-đun đích mà bạn muốn sử dụng các khía cạnh với

MỤC TIÊU MODULE

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.4</version> 
      <configuration> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>that-artifact</groupId> 
         <artifactId>mentioned-above</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
       <source>1.6</source> 
       <target>1.6</target> 
       <complianceLevel>1.6</complianceLevel> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>test-compile</goal> 
        </goals> 
        <configuration> 
         <showWeaveInfo>true</showWeaveInfo> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Bạn phải sử dụng cấp độ 1.6 ở mọi nơi

+0

awsome thank you man –