2011-09-15 7 views
10

मेरे पास एकीकरण परीक्षण (लोड संदर्भ) और यूनिट परीक्षण एक साथ चल रहे हैं। मेरा कोड springj संकलन समय वसंत का उपयोग कर बुनाई करता है।यूनिट परीक्षण के दौरान कुछ पहलुओं को अक्षम करना

मेरे समस्या यह है कि मेरी घोषित भी मेरी इकाई परीक्षण के कुछ के दौरान चलाने सलाह देता है। यह एक यूनिट परीक्षण की धारणा को मारता है, यही कारण है कि मैं उन्हें अक्षम करना चाहता हूं।

क्या कुछ ऐसा है जो मैं पॉइंटकट घोषणा पर डाल सकता हूं, कुछ विधि जिसे मैं कॉल कर सकता हूं, कुछ वसंत विन्यास, या मैवेन कमांड जो इन सलाहयों को सभी * यूनिटटेस्ट.जावा जैसे कुछ के लिए अक्षम करता है?

सहायता के लिए धन्यवाद।


उदाहरण:

मैं निम्नलिखित इकाई परीक्षण:

@RunWith(MockitoJUnitRunner.class) 
public class CompanyServiceImplTest { 
    @Test 
    public void createCampaignTest() throws Exception { 
     when(companyDaoMock.saveCompany(any(Campaign.class))).thenReturn(77L); 

     Long campaignId = companyService.createCampaign(campaignMock); 

     assertEquals(Long.valueOf(77L), Long.valueOf(campaignId)); 
    } 
} 

और निम्न सेवा विधि:

@Override 
@Transactional 
@EventJournal(type = EventType.CAMPAIGN_CREATE, owner = EventOwner.TERMINAL_USER) 
public Long createCampaign(Campaign campaign) { 
    return companyDao.saveCompany(campaign); 
} 

पहलू:

@Aspect 
public class EventJournalAspect { 

    @Autowired 
    private EventJournalService eventJournalService; 

    @Pointcut(value="execution(public * *(..))") 
    public void anyPublicMethod() {} 

    @Pointcut("within(com.terminal.service..*)") 
    private void inService() {} 

    @AfterReturning(pointcut = "anyPublicMethod() && inService() && @annotation(eventJournal) && args(entity,..)", returning = "id") 
    public void process(Object id, EventJournal eventJournal, AbstractDomainEntity entity) 
      throws Throwable { 
     if (eventJournal.type() != EventType.CAMPAIGN_PAYMENT || id != null) { 
      saveEvent(eventJournal, EventStatus.SUCCESS, entity, (Long) id); 
     } 
    } 

    @AfterThrowing(pointcut = "anyPublicMethod() && inService() && @annotation(eventJournal) && args(entity,..)", throwing="ex") 
    public void processException(EventJournal eventJournal, AbstractDomainEntity entity, Exception ex) throws Throwable { 
     saveEvent(eventJournal, EventStatus.FAILURE, entity, null); 
    } 

    private void saveEvent(EventJournal eventJournal, EventStatus status, AbstractDomainEntity entity, Long persistentId) { 
     EventType type = eventJournal.type(); 
     EventOwner owner = eventJournal.owner(); 
     eventJournalService.saveEvent(type, owner, EventStatus.SUCCESS, entity, persistentId); 
    } 

} 

जब परीक्षण निष्पादित करता है - eventJournalService शून्य है। इस प्रकार मैं देख रहा हूँ NullPointerException

उत्तर

0

मैं केवल अनुमान लगा सकते हैं: पहली बात, एक अलग स्प्रिंग applicationContext-test.xml के लिए बिना घटक स्कैन है; मेवेन में आप परीक्षण के लिए बुनाई जार को छोड़कर एक चरण रनटाइम जोड़ सकते हैं।

0

संकलन समय बुनाई सलाह इनलाइन हैं pointcuts है कि आप द्वारा की पहचान लक्षित तरीकों में कहता है। मुझे व्यक्तिगत रूप से लगता है कि यह इकाई परीक्षण के लिए अच्छा है जो संकलन समय के साथ बुनाई के साथ अच्छा है, क्योंकि रनटाइम पर आपकी इकाई में कक्षा के साथ सलाह शामिल है?

सोचा कि मुझे सलाह शामिल नहीं करना है, इसमें दो अलग-अलग संकलन लक्ष्य होंगे, एक संकलन समय बुनाई के साथ, और बिना किसी के, आप इसे मैवेन प्रोफाइल के माध्यम से ऐसा करने में सक्षम होना चाहिए, एक देव प्रोफ़ाइल जिसमें सलाह बुनाई नहीं है और एक prod प्रोफ़ाइल में पहलुओं बुनाई करना

3

जवाब सरल है:। आप एक if() pointcut expression उपयोग करना चाहते हैं।


अद्यतन (के बाद सवाल भी अद्यतन किया गया है): मूल रूप से दिए गए लिंक से ऊपर पर्याप्त जानकारी हो जाना चाहिए, लेकिन क्या इसके लायक है के लिए, एक संक्षिप्त विवरण और एक साधारण उदाहरण:

एक if() पॉइंटकट static पहलू विधि boolean लौटा रही है। यदि वापसी मान true है, तो इसका मतलब है कि myPointcut() && if() जैसे किसी भी संयुक्त पॉइंटकट myPointcut() मैचों तक मेल खाता है। false के वापसी मूल्य के लिए संपूर्ण संयुक्त पॉइंटकट मेल नहीं खाता है, जो पॉइंटकट से जुड़ी किसी भी सलाह को प्रभावी ढंग से निष्क्रिय कर रहा है।

तो क्या आप एक स्थिर if() pointcut में कर सकते हैं?

  • का मूल्यांकन TestMode.ACTIVE जैसे कुछ उपकरण वर्ग के एक स्थिर बूलियन सदस्य जो इकाई या एकीकरण के परीक्षण के दौरान ही सच है
  • एक वातावरण चर जो केवल परीक्षण के दौरान सेट कर दिया जाता
  • एक जावा प्रणाली संपत्ति है जो केवल है मूल्यांकन का मूल्यांकन
  • परीक्षण के दौरान सेट और कई और अधिक चीजों

आप कुछ अधिक सजावटी (और जटिल काम) करना चाहते हैं तो और प्रदर्शन इतना महत्वपूर्ण नहीं है, तुम ग एक गतिशील रूप से यह निर्धारित करने का भी प्रयास करता है कि ऑटो-वायर्ड पहलू सदस्य चर नल के बराबर है या नहीं और केवल इंजेक्शन ऑब्जेक्ट मौजूद होने पर ही आपके पॉइंटकट को सक्रिय करें। यहां एकमात्र समस्या एक स्थिर विधि से सदस्य चर निर्धारित करने का तरीका है। मैं वसंत AOP के बारे में पता नहीं है, लेकिन सादे AspectJ में वहाँ aspectOf(..) नामित कई अतिभारित तरीकों के साथ सहायक वर्ग Aspects है। यह मानते हुए कि आपके पहलू एक सिंगलटन के रूप में instantiated है, तो आप कुछ इस तरह कर सकता है:

@Pointcut("if()") 
public static boolean isActive() { 
    return Aspects.aspectOf(PerformanceMonitorAspect.class).eventJournalService != null; 
} 

// ... 

@AfterReturning(pointcut = "isActive() && anyPublicMethod() && inService() && @annotation(eventJournal) && args(entity,..)", returning = "id") 
// ... 

@AfterThrowing(pointcut = "isActive() && anyPublicMethod() && inService() && @annotation(eventJournal) && args(entity,..)", throwing="ex") 
// ... 
+0

उदाहरण प्रदान करें – gstackoverflow

+0

मैंने मूल पोस्ट में विवरण जोड़ा है। – gstackoverflow

+0

आप किसी ऐसे प्रश्न में विवरण कैसे जोड़ सकते हैं जिसका आप मूल पोस्टर नहीं हैं? – kriegaex

0

आप एक विधि देता है कि अगर वर्तमान निष्पादन JUnit ढांचे का उपयोग कर शुरू किया गया था लिख ​​सकते हैं।

विधि थ्रेड.currentThread()। GetStackTrace() के साथ स्टैक ट्रेस की जांच कर सकती है और MockitoJUnitRunner उपस्थिति की खोज कर सकती है।

मैंने SpringJUnit4ClassRunner का उपयोग करके इस समाधान का परीक्षण किया लेकिन मुझे लगता है कि MockitoJUnitRunner के साथ काम कर सकता है। (अपने परीक्षण में नहीं)

private static boolean TEST_ENVIRONMENT = false; 

एक वर्ग अपनी परियोजना में वर्तमान में और के बजाय उपयोग स्टैक ट्रेस नियंत्रण पद्धति में मूल्य की जाँच करें:

इसके अलावा, आप की तरह एक स्थिर बूलियन क्षेत्र मिल गया है सकते हैं।

जब आप अपने परीक्षण चलाते हैं, तो आप TEST_ENVIRONMENT = true सेट करने के लिए @BeforeClass एनोटेशन का उपयोग कर सकते हैं।

यह समाधान केवल आपको यह जानने का तरीका देता है कि आपका कोड परीक्षण से चल रहा है या नहीं।

संबंधित मुद्दे