2011-02-23 18 views
7

क्या JUnit परीक्षण होगा जब मैं निम्न विधि है:JUnit()

@Override 
public void saveLastSuccesfullLogin(final User user) { 
    gebruiker.setLastLogin(new Date()); 
    storeUser(user); 
} 

submethode storeUser:

@Override 
public void storeUser(final User user) { 
    EntityManager em = emf.createEntityManager(); 

    em.getTransaction().begin(); 
    em.merge(user); 
    em.getTransaction().commit(); 

    em.close(); 
} 
समस्या मैं है तिथि, के लिए स्थापित किया जा रहा है

इकाई उपयोगकर्ता और फिर संग्रहीत। मैं जूनिट और easymock का उपयोग कर।

उत्तर

4

तरह डिफ़ॉल्ट पहुँच विनिर्देशक के साथ एक विधि में नई तिथि() खींच प्रयास करें

@Override 
public void saveLastSuccesfullLogin(final User user) { 
    gebruiker.setLastLogin(getDate()); 
    storeUser(user); 
} 
Date getDate() { 
    return new Date(); 
} 

यो में नीचे आप परीक्षण कक्षा एक नकली या stubbed तारीख का उपयोग कर नीचे के रूप में कक्षा को ओवरराइड करते हैं।

<ClassUnderTest> classUnderTest = new <ClassUnderTest>() { 
    @Override 
    Date getDate() { 
    return mockDate; 
    } 
} 

इस तरह आप दिनांक मूल्य को आसानी से दावा कर सकते हैं क्योंकि इसे बाहर निकाला जा रहा है।

+2

अज्ञात वर्ग के साथ ओवरराइड करने के बजाय मैं [मॉकिटो का आंशिक नकली] (http://blog.javabien.net/2009/06/21/mockitos-partial-mocks-testing-real-objects-just-got- आसान/)। तो यह क्लासउंडटेस्ट टी = जासूस होगा (नया क्लासउंडटेस्ट()); जब (t.getDate())।thenReturn (DATE_MOCK); –

+0

@ SauliusŠimčikas –

3

तिथि के साथ क्या समस्या है? कि आप नहीं जानते कि बाद में जोर देना क्या है? कुछ विकल्प:

  1. विधि
  2. में तारीख दर्रा एक कारखाने बनाएं वर्तमान दिनांक/समय प्राप्त करने के लिए ताकि आप इसे बाहर नकली कर सकते हैं
  3. शुद्धता के एक सीमा के भीतर की तारीख का दावा
0

एक और "उद्यम" दृष्टिकोण भी है जिसका उपयोग किया जा सकता है जहां निर्भरता इंजेक्शन उपलब्ध है (जैसे ईजेबी, वसंत इत्यादि)।

आप एक इंटरफ़ेस परिभाषित कर सकते हैं, उदाहरण के लिए टाइम सेवा और वर्तमान विधि को वापस करने वाली ई विधि जोड़ें।

public interface TimeService { 
    Date getCurrentDate(); 
    } 

आप इस लागू new Date() लौट सकते हैं और इस तरह से इसका इस्तेमाल करने के कर सकते हैं:

gebruiker.setLastLogin(timeService.getCurrentTime()); 

यह स्पष्ट रूप से परीक्षण करने के लिए है क्योंकि आप TimeService नकली कर सकते हैं बहुत आसान हो जाएगा। EasyMock (सिर्फ एक उदाहरण) का उपयोग करना, यह हो सकता है:

Date relevantDateForTest = ... 
    expect(timeService.getCurrentTime()).andReturn(relevantDateForTest); 
    replay(timeService); 

पूरे कोड भर TimeService का उपयोग करना और कभी नहीं का उपयोग कर new Date() एक बहुत अच्छा अभ्यास है और अन्य लाभ भी है। मैंने कई अवसरों में इसे उपयोगी पाया, जिसमें भविष्य में सक्रिय होने वाली सुविधाओं के मैन्युअल कार्यात्मक परीक्षण शामिल हैं। भी आगे जा रहे हैं, सिस्टम का समय एक बाहरी प्रणाली से लिया गया हो सकता है इस प्रकार यह समूहों आदि भर में लगातार बना

+0

को इंगित करने के लिए धन्यवाद मैंने उन लोगों के लिए अधिक विस्तृत [यहां पोस्ट करें] (http://larselrund.com/2011/08/05/junit-with-new-date/) लिखा है जो उपयोग करने के बारे में अधिक पढ़ना चाहते हैं वर्तमान तारीख को पुनः प्राप्त करने के लिए अलग सेवा। – Neovibrant

0

तुम भी एक getDate विधि, और एक तिथि स्थिर वर बना सकते हैं: में फिर

private static Date thisDate = null; 

    @Override 
    public void saveLastSuccesfullLogin(final User user) { 
     gebruiker.setLastLogin(getDate()); 
     storeUser(user); 
    } 

    public Date getDate() { 
     if(thisDate != null) return thisDate; 
     return new Date(); 
    } 

    public void setDate(Date newDate) { 
     thisDate = newDate; 
    } 

अपने टेस्ट विधि, आप आगे बढ़ सकते हैं और सेट डेट को कॉल कर सकते हैं ताकि आप किस तारीख को प्राप्त कर सकें।