2009-09-26 18 views
7

मैं कुल कमांडर-जैसे एप्लिकेशन लिख रहा हूं। मेरे पास फ़ाइल सूची के लिए एक अलग घटक है, और इसके लिए एक मॉडल है। मॉडल समर्थन श्रोताओं और मुद्दों निम्नलिखित तरीके से CurrentDirChanged आदि तरह की घटनाओं के लिए एक अधिसूचना:यूनिट परीक्षण एक स्विंग घटक

 
private void fireCurrentDirectoryChanged(final IFile dir) { 
    if (SwingUtilities.isEventDispatchThread()) 
     for (FileTableEventsListener listener : tableListeners) 
      listener.currentDirectoryChanged(dir); 
    else { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       for (FileTableEventsListener listener : tableListeners) 
        listener.currentDirectoryChanged(dir); 
      } 
     }); 
    } 
} 

मैं इस के लिए एक साधारण परीक्षण लिखा है:

 
@Test 
public void testEvents() throws IOException { 
    IFile testDir = mockDirectoryStructure(); 
    final FileSystemEventsListener listener = 
       context.mock(FileSystemEventsListener.class); 
    context.checking(new Expectations() {{ 
     oneOf(listener).currentDirectoryChanged(with(any(IFile.class))); 
    }}); 

    FileTableModel model = new FileTableModel(testDir); 
    model.switchToInnerDirectory(1); 
} 

यह काम नहीं करता है, क्योंकि वहाँ कोई EventDispatchThread। क्या हेडलेस बिल्ड के अंदर यूनिट परीक्षण करने का कोई तरीका है?

इकाई परीक्षण जावा स्विंग jmock

उत्तर

10

ध्यान दें, यूआई सामान पर इकाई परीक्षण आम तौर पर हमेशा मुश्किल होता है क्योंकि आप सामान का एक बहुत जो सिर्फ उपलब्ध नहीं है बाहर उपहास करने के लिए है।
इसलिए अनुप्रयोगों (किसी भी प्रकार का) विकसित करने का मुख्य उद्देश्य मुख्य अनुप्रयोग तर्क से जितना संभव हो सके यूआई सामान को अलग करने का प्रयास करना हमेशा होता है। यहां मजबूत निर्भरता रखने के बाद, इकाई परीक्षण वास्तव में कठिन बनाते हैं, मूल रूप से एक दुःस्वप्न। यह आमतौर पर MVC प्रकार के दृष्टिकोण जैसे पैटर्न का उपयोग करके लीवरेज किया जाता है, जहां आप मुख्य रूप से अपने नियंत्रक वर्गों का परीक्षण करते हैं और आपके व्यू क्लास यूआई बनाने और नियंत्रकों को उनके कार्यों और घटनाओं को प्रस्तुत करने से कुछ भी नहीं करते हैं। यह जिम्मेदारियों को अलग करता है और परीक्षण को आसान बनाता है।

इसके अलावा आपको पहले से ही फ्रेमवर्क द्वारा प्रदान की जाने वाली चीजों का परीक्षण नहीं करना चाहिए जैसे परीक्षण करना कि घटनाओं को सही ढंग से निकाल दिया गया है या नहीं। आपको केवल उस तर्क का परीक्षण करना चाहिए जिसे आप स्वयं लिख रहे हैं।

+1

मैंने यह सह लिखा और मैं परीक्षण करना चाहता हूं कि यह सही पैरामीटर के साथ और जब घटनाओं को आग लगती है।मुझे लगता है, मैं यहां क्या गलत कर रहा हूं, एक मॉडल के अंदर जीयूआई थ्रेड सुनिश्चित करना है। मॉडल एक स्विंग घटक नहीं है, इसे जीयूआई थ्रेड के अंदर घटनाओं को आग लगाना नहीं है। क्या मैं यहाँ सही ढंग से सोच रहा हूँ? –

12

देखो this:

FEST पुस्तकालयों का एक संग्रह,, जिसका मिशन सॉफ्टवेयर परीक्षण आसान बनाने के लिए है Apache 2.0 license के तहत जारी की है। यह विभिन्न मॉड्यूल है, जो TestNG या JUnit साथ इस्तेमाल किया जा सकता से बना है ...

+0

दिलचस्प लग रहा है। –

+0

क्षमा करें आपका उत्तर स्वीकार न करें, लेकिन मैं वास्तव में जीयूआई का परीक्षण नहीं करना चाहता, मैं केवल समस्याओं के बिना अपने मॉडल का परीक्षण करना चाहता हूं। –

2

चेक uispec4j परियोजना। मैं अपने यूआई का परीक्षण करने के लिए यही उपयोग करता हूं।

www.uispec4j.org

+0

....... निष्क्रिय परियोजना की तरह लगता है? (लिंक अब ऐसा नहीं लगता है कि यह पहले कहाँ गया था) – Snappawapa

1

मैं केवल दो दिनों के लिए jMock साथ काम कर रहा है ... इसलिए कृपया मुझे क्षमा करें अगर वहाँ एक और अधिक सुरुचिपूर्ण समाधान है। :)

ऐसा लगता है कि आपके FileTableModel स्विंग यूटिलिटीज पर निर्भर करता है ... क्या आपने स्विंग यूटिलिटीज का उपयोग करने पर विचार किया है? एक तरीका है जो एक हैक की तरह गंध करता है लेकिन समस्या का समाधान करेगा, एक इंटरफेस बनाना होगा, आईएसविंग यूटिलिटीज कहें, और एक डमी क्लास माईविंग यूटिलिटीज को लागू करें जो वास्तविक स्विंग यूटिलिटीज के लिए आगे बढ़े। और फिर अपने परीक्षण मामले में आप इंटरफ़ेस का नकल कर सकते हैं और isEventDispatchThread के लिए सत्य लौट सकते हैं।

@Test 
public void testEventsNow() throws IOException { 
    IFile testDir = mockDirectoryStructure(); 

    final ISwingUtilities swingUtils = context.mock(ISwingUtilities.class); 

    final FileSystemEventsListener listener = 
       context.mock(FileSystemEventsListener.class); 

    context.checking(new Expectations() 
    {{ 
     oneOf(swingUtils).isEventDispatchThread(); 
      will(returnValue(true)); 

     oneOf(listener).currentDirectoryChanged(with(any(IFile.class))); 
    }}); 

    FileTableModel model = new FileTableModel(testDir); 
    model.setSwingUtilities(swingUtils); // or use constructor injection if you prefer 
    model.switchToInnerDirectory(1); 
} 
+0

यह मूल रूप से हम इसे कैसे करते हैं। हम SwingUtilities को OurSwingUtilities.getInstance() के साथ प्रतिस्थापित करते हैं और फिर परीक्षणों में, हमारे पास एक वैकल्पिक कार्यान्वयन होता है (हम इसके लिए jmock का उपयोग नहीं करते हैं, क्योंकि बहुत सारे परीक्षण एक वर्ग को अधिक आसानी से साझा कर सकते हैं।) हम SwingWorker.execute के लिए ऐसा करते हैं() के साथ-साथ पूरी तरह से उपयोगिताएं जो जावा लाइब्रेरी में स्थिर हैं। – Trejkaz

2

मुझे लगता है कि परीक्षण के साथ समस्या कोड के साथ एक समस्या का खुलासा कर रही है। यह तय करने के लिए वास्तव में मॉडल का काम नहीं होना चाहिए कि यह प्रेषण धागे में चल रहा है या नहीं, यह बहुत ज़िम्मेदारियां है। इसे सिर्फ अपनी अधिसूचना नौकरी करनी चाहिए और एक कॉलिंग घटक को यह तय करना चाहिए कि उसे सीधे कॉल करना है या नहीं। वह घटक उस कोड के हिस्से में होना चाहिए जो स्विंग धागे के बारे में जानता है। इस घटक को केवल फाइलों और इस तरह के बारे में पता होना चाहिए।

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