2013-06-06 6 views
7

के माध्यम से निष्पादित नहीं की जा रही है, मैं स्टंप हो गया हूं। मैं एक AspectJ कक्षा का परीक्षण करने की कोशिश कर रहा हूँ। जब मैं अपना आवेदन चला रहा हूं तो माई आस्पेक्ट क्लास पूरी तरह से उठाया जाता है। हालांकि, मुझे लगता है कि किसी भी पहलू वर्ग को किसी भी विधि में किसी भी विधि को रोकने के लिए असमर्थ होना प्रतीत होता है।AspectJ सलाह यूनिट परीक्षण

मैं वसंत 3.2.2, AspectJ 1.7.2 और Maven 4.

यहाँ उपयोग कर रहा हूँ साधारण परीक्षण के साथ मैं काम कर रहा हूँ है:

टेस्ट AspectJ वर्ग

package my.package.path.config; 

import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

@Aspect 
public class TestAOP { 
    private String message; 

    public TestAOP() { 
    } 

    @Pointcut("execution(* my.package.path.TestAOPClient.relayMessage(..))") 
    public void aopPointcut() { 
    } 

    @Around("aopPointcut()") 
    public String monitor(ProceedingJoinPoint pjp) throws Throwable { 
     String msg = (String)pjp.proceed(); 
     this.setMessage(msg); 
     return msg; 
    } 

}

वर्ग जिसका विधि पकड़ा जा रहा है

package my.package.path.config; 

public class TestAOPClient { 
    public String relayMessage(String msg) { 
     return msg; 
    } 
} 

टेस्ट कक्षा

package my.package.path.config; 

import static org.hamcrest.Matchers.equalTo; 
import static org.junit.Assert.assertThat; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.context.web.WebAppConfiguration; 

@Configuration 
@ContextConfiguration(classes={WebConfig.class}) 
@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration("src/main/java") 
public class AopConfigTest extends AbstractJUnit4SpringContextTests { 

    @Bean 
    public TestAOP testAop() throws Exception { 
     return new TestAOP(); 
    } 

    @Test 
    public void assertTestConfigIsActive() { 
     TestAOPClient client = new TestAOPClient(); 
     client.relayMessage("hello"); 
     assertThat(((TestAOP)applicationContext.getBean("testAop")).getMessage(), equalTo("hello")); 

    } 
} 

WebConfig फ़ाइल

package my.package.path.web.context; 
@Configuration 
@EnableWebMvc 
@EnableAspectJAutoProxy(proxyTargetClass=false) 
@ComponentScan(value={"my.package.path.config", "my.package.path.web"}) 
public class WebConfig { 

} 

हमेशा, मैं, अभिकथन त्रुटि

Expected: "hello" but: was null 

मेरे WebApplicationContext, उठाया जाना कार्यावधि में के बाद से लगता है मिल जाएगा अगर मैं एक वर्ग निर्दिष्ट करता हूं जो मेरे आस्पेक्ट पॉइंटकट के लिए मौजूद नहीं है, तो मुझे एक त्रुटि कॉन्टेक्स्ट त्रुटि लोड करने में विफल रहेगा।

मुझे क्या याद आ रही है?

उत्तर

5

यह अजीब बात है कि आप अपने यूनिट परीक्षण का उपयोग @Configuration स्रोत के रूप में भी कर रहे हैं।

आपको इकाई परीक्षण से @Configuration एनोटेशन को हटा देना चाहिए और testAOP() बीन परिभाषा WebConfig पर ले जाना चाहिए। लेकिन सबसे महत्वपूर्ण सेम क्योंकि उन्हें यह पता मैन्युअल बनाया नहीं किया जाना चाहिए, लेकिन वसंत द्वारा:

@ContextConfiguration(classes={WebConfig.class}) 
@WebAppConfiguration("src/main/java") 
public class AopConfigTest extends AbstractJUnit4SpringContextTests { 

    @Autowired 
    private TestAOP testAop; 

    @Autowired 
    private TestAOPClient client; 

    @Test 
    public void assertTestConfigIsActive() { 
     client.relayMessage("hello"); 
     assertThat(((TestAOP)applicationContext.getBean("testAop")).getMessage(), 
      equalTo("hello")); 
    } 

} 

सेम परिभाषा के साथ config अपडेट किया गया: चाहे AOP विन्यास का परीक्षण करने के

@Configuration 
@EnableWebMvc 
@EnableAspectJAutoProxy(proxyTargetClass=false) 
@ComponentScan(value={"my.package.path.config", "my.package.path.web"}) 
public class WebConfig { 

    @Bean 
    public TestAOP testAop() throws Exception { 
     return new TestAOP(); 
    } 

    @Bean 
    public TestAOPClient testAopClient() throws Exception { 
     return new TestAOPClient(); 
    } 

} 

यदि आपका लक्ष्य था काम करता है और TestAOP वास्तव में एक परीक्षण बीन है (न केवल इस प्रश्न के लिए एक डमी नाम), आप एक विशेष TestConfig कॉन्फ़िगरेशन क्लास बना सकते हैं, वहां बीन परिभाषा को स्थानांतरित कर सकते हैं और परीक्षण @ContextConfiguration(classes={WebConfig.class,TestConfig.class}) से इसका उपयोग कर सकते हैं।

+1

मैंने आपके सुझावों के अनुसार चीजों को स्थानांतरित कर दिया।यह क्लीनर दिखता है। लेकिन यह अभी भी काम नहीं करता है। अभी, मेरे पास कोड के स्रोत/मुख्य/जावा क्षेत्र में मेरी परीक्षा कक्षाएं हैं, जबकि टेस्ट क्लास स्वयं src/test/java में है। WebConfig में TestAOP एनोटेट किया गया है। परीक्षण चलने पर यह कब और कैसे बुनाई से संबंधित हो सकता है? क्या ऐसा कोई विन्यास है जिसे मुझे कहीं ऐसा करने के लिए सेट करने की आवश्यकता है? मैं वसंत के लिए बहुत नया हूँ। – Emilie

+1

हे, बस पाया है कि आप 'TestAOPClient ग्राहक = नए TestAOPClient() की परीक्षा में मैन्युअल रूप से लक्ष्य सेम पैदा कर रहे;' ... यह इस तरह से काम नहीं करता। वसंत वह होना चाहिए जो बीन बना रहा हो! मैं अपना जवाब अपडेट करूंगा। –

+1

उत्तर अद्यतन किया गया। –

1

आपका pointcut विन्यास गलत है (पैकेज आपके परीक्षण ग्राहक मैच के लिए my.package.path.config किया जाना चाहिए)

@Pointcut("execution(* my.package.path.TestAOPClient.relayMessage(..))") 

और आपके ग्राहक

package my.package.path.config; 

public class TestAOPClient { 
... 

इस

के लिए यह परिवर्तन है
@Pointcut("execution(* my.package.path.config.TestAOPClient.relayMessage(..))") 

काम करना चाहिए।

+1

यह एक टाइपो है जब मैंने कंपनी के नाम का पर्दाफाश करने के लिए अपना पैकेज नाम बदल दिया। मैंने संकुल की समीक्षा की और वे सही हैं .. – Emilie

+0

इस उत्तर के लिए धन्यवाद। मुझे @Emilie की एक समान समस्या थी, और मेरी '@ प्वाइंटकट' अभिव्यक्ति अंतिम समस्या थी जो मेरी '@ इससे पहले' चलने से सलाह को रोक रही थी! –