it-swarm.com.de

java: Wie verspotte ich Calendar.getInstance ()?

In meinem Code habe ich so etwas:

private void doSomething() {
   Calendar today = Calendar.getInstance();
   ....
}

Wie kann ich es in meinem Junit-Test "verspotten", ein bestimmtes Datum zurückzugeben?

22
Randomize

Soweit ich es sehe, gibt es drei sinnvolle Optionen:

  1. Injizieren Sie die Calendar-Instanz in der Methode/Klasse, in der Sie den Tag festgelegt haben.

    private void method(final Calendar cal) { Date today = cal.getTime(); }

  2. Verwenden Sie JodaTime anstelle von Calendar. Dies ist weniger eine Option und eher ein Fall eines Vorschlags, da JodaTime Ihnen das Leben erheblich erleichtert. Sie müssen diese Zeit noch in die Methode injizieren.

    DateTime dt = new DateTime();

    Date jdkDate = dt.toDate();

  3. Wickeln Sie Calendar in eine Schnittstelle, mit der Sie die Uhrzeit abrufen können. Sie mockten dann einfach diese Schnittstelle und bringen es dazu, eine Konstante Date zurückzugeben.

    Date today = calendarInterfaceInstance.getCurrentDate()

16
BeRecursive

Sie können es mit PowerMock in Kombination mit Mockito simulieren:

Zusätzlich zu deiner Klasse:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassThatCallsTheCalendar.class})

Der Schlüssel zum Erfolg besteht darin, dass Sie die Klasse, in der Sie Kalender verwenden, in PrepareForTest anstelle von Calendar selbst einfügen müssen, da es sich um eine Systemklasse handelt. (Ich musste viel suchen, bevor ich das gefunden habe) 

Dann die Verspottung selbst:

mockStatic(Calendar.class);
when(Calendar.getInstance()).thenReturn(calendar);
13
GoGoris

Verspotten Sie es nicht - stattdessen führen Sie eine Methode ein, mit der Sie verspotten können, dass Datumsangaben erhalten. Etwas wie das:

interface Utility {

    Date getDate();
}

Utilities implements Utility {


    public Date getDate() {

        return Calendar.getInstance().getTime();
    }

}

Dann können Sie dies in Ihre Klasse einfügen oder einfach eine Helfer-Klasse mit einer Reihe statischer Methoden mit einer Lademethode für das Interface verwenden:

public class AppUtil {

    private static Utility util = new Utilities();

    public static void load(Utility newUtil) {

         this.util = newUtil;
    }

    public static Date getDate() {

        return util.getDate();
    }

}

Dann in Ihrem Anwendungscode: 

private void doSomething() {
   Date today = AppUtil.getDate();
   ....
}

Sie können dann einfach eine Mock-Schnittstelle in Ihre Testmethoden laden.

@Test
public void shouldDoSomethingUseful() {
     Utility mockUtility = // .. create mock here
     AppUtil.load(mockUtility);

     // .. set up your expectations

     // exercise the functionality
     classUnderTest.doSomethingViaAPI();

     // ... maybe assert something 

}

Siehe auch Solltest du nur eigene Typen nachahmen? und Testgeruch - alles wird verspottet

9
blank

Verwendung von Mockito und PowerMockito:

Calendar endOfMarch = Calendar.getInstance();
endOfMarch.set(2011, Calendar.MARCH, 27);
PowerMockito.mockStatic(Calendar.class);
Mockito.when(Calendar.getInstance()).thenReturn(endOfMarch);

Den vollständigen Code finden Sie unter link .

6
Surekha

Schreiben Sie eine Klasse namens DateHelper mit einer Methode getCalendar, die Calendar.getInstance() zurückgibt. Umgestalten Sie die Klasse, die Sie testen, so dass sie eine Membervariable vom Typ DateHelper und einen Konstruktor hat, der diese Membervariable einfügt. Verwenden Sie diesen Konstruktor in Ihrem Test, um ein Modell von DateHelper einzuspeisen, in dem getCalendar für ein bekanntes Datum abgelehnt wurde.

2

Sie können mit JMockit nachahmen. Hier können Sie sehen, wie Sie dies tun können: Mock Java Calendar - JMockit vs Mockito .

1
Behrang

Für diejenigen, die das MVP-Muster nachahmen, ist Kalender ein Kinderspiel:

  1. Erstellen Sie in einem Presenter eine Methode, die die Kalenderinstanz zurückgibt:

     public Calendar getCurrentTime() {  
            return Calendar.getInstance();    
        }
    
  2. In Ihrer Ansicht (Aktivität, Fragment usw.) können Sie mithilfe des Präsentators auf den Kalender zugreifen:

     Calendar calendar = mPresenter.getCurrentTime();   
     // do whatever you want
    
  3. In deinen Tests machst du:

     // create a dummy calendar   
     Calendar mockCalendar = ...   
     // You've already mocked your Presenter, haven't you?   
     when(mMockPresenter.getCurrentTime()).thenReturn(mockCalendar);   
     // here you are!
    
0
Leo Droidcoder