2012-07-11 40 views
21

Tôi có thể kiểm tra đơn vị hầu hết các lớp Spring của mình mà không cần phải làm công cụ "Spring".Thử nghiệm đơn vị Các phương pháp Spring @Around AOP

tôi có thể đơn phương tư vấn xét nghiệm @Before mà không cần sử dụng Spring quá:

Ví dụ mã:

@Before("execution(* run(..)) && " + "" + 
      "target(target) && " + 
     "args(name)") 
public void logName(Object target, String name) { 
    logger.info("{} - run: {}", target, name); 
} 

kiểm tra Ví dụ:

@Test 
public void testLogName() { 
    aspect.setLogger(mockLogger); 
    aspect.logName(this,"Barry"); 
    assertTrue(mockLogger.hasLogged("TestAspect - run: Barry")); 
} 

Tuy nhiên @Around giao dịch tư vấn với một đối tượng ProceedingJoinPoint :

@Around("com.xyz.myapp.SystemArchitecture.businessService()") 
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { 
    // start stopwatch 
    Object retVal = pjp.proceed(); 
    // stop stopwatch 
    return retVal; 
} 

Tôi không biết cách khởi tạo đối tượng ProceedingJoinPoint. Làm cách nào để kiểm tra lớp này mà không bắt đầu toàn bộ bối cảnh ứng dụng Spring?

+0

Bạn có thể cung cấp mã hoàn chỉnh không, cách bạn đã triển khai trường hợp thử nghiệm cho @Trước khi? Tôi cần giúp đỡ trong việc thực hiện điều này. –

Trả lời

49

Bạn có thể thử nghiệm một Aspect mùa xuân bằng cách tạo ra một proxy programatically:

MyInterface target = new MyClass(); 
AspectJProxyFactory factory = new AspectJProxyFactory(target); 
MyAspect aspect = new MyAspect(arg); 
factory.addAspect(aspect); 
MyInterface proxy = factory.getProxy(); 

... sau đó bạn có thể gọi phương pháp trên proxy, và làm cho khẳng định về aspect, proxytarget.

+1

Great thx - cuối cùng tôi có thể kiểm tra đúng thứ đó. Bạn có bất kỳ ý tưởng nào tại sao bạn phải làm điều này theo chương trình không? Tôi đã khai báo MyAspect như một bean và tải ngữ cảnh này trong bài kiểm tra đơn vị và do đó mong đợi khía cạnh được thực hiện - nhưng nó chỉ hoạt động theo cách bạn mô tả ... – CodeSeavers

+0

Vâng * I * phải làm điều đó bởi vì lựa chọn tôi không ' t sử dụng Spring trong các bài kiểm tra đơn vị của tôi. Nếu bạn muốn bắt đầu một bối cảnh mùa xuân trong các bài kiểm tra đơn vị của bạn, thì áp dụng các cân nhắc mùa xuân bình thường. – slim

+0

Các xác nhận sẽ như thế nào? Bạn có một số ví dụ? – mip

Các vấn đề liên quan