java: comment se moquer du calendrier.getInstance ()?


Dans mon code j'ai quelque chose comme ceci:

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

Comment puis-je le" simuler " dans mon test junit pour renvoyer une date spécifique?

Author: Randomize, 2012-02-14

7 answers

Pour autant que je le vois, vous avez trois options sensées:

  1. Injectez l'instance Calendar dans la méthode/classe que vous avez définie ce jour-là.

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

  2. Utiliser JodaTime au lieu de Calendar. C'est moins une option et plus un cas de suggestion car JodaTime vous facilitera la vie. Vous devrez toujours injecter cette fois dans la méthode.

    DateTime dt = new DateTime();

    Date jdkDate = dt.toDate();

  3. Envelopper Calendar dans une interface qui vous permet de récupérer le temps. Vous vous moquez ensuite de cette interface et l'obtenez pour renvoyer une constante Date.

    Date today = calendarInterfaceInstance.getCurrentDate()

 16
Author: BeRecursive, 2012-02-14 11:23:21

Vous pouvez vous en moquer en utilisant PowerMock en combinaison avec Mockito:

En haut de votre classe:

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

La clé du succès est que vous devez mettre la classe où vous utilisez Calendar dans PrepareForTest au lieu de Calendar lui-même car il s'agit d'une classe système. (Personnellement, j'ai dû beaucoup chercher avant de trouver cela)

Puis le moqueur lui-même:

mockStatic(Calendar.class);
when(Calendar.getInstance()).thenReturn(calendar);
 11
Author: GoGoris, 2016-04-07 09:46:32

Ne vous moquez pas - introduisez plutôt une méthode que vous pouvez moquer qui obtient des dates. Quelque chose comme ceci:

interface Utility {

    Date getDate();
}

Utilities implements Utility {


    public Date getDate() {

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

}

, Alors vous pouvez injecter dans votre classe ou tout simplement utiliser une classe d'assistance avec un tas de méthodes statiques avec une méthode de chargement de l'interface:

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();
    }

}

Puis dans votre code d'application:

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

Vous pouvez ensuite simplement charger une interface simulée dans vos méthodes de test.

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

     // .. set up your expectations

     // exercise the functionality
     classUnderTest.doSomethingViaAPI();

     // ... maybe assert something 

}

Voir aussi Devriez-vous seulement simuler les types que vous possédez? et Tester l'odeur - tout est moqué

 9
Author: blank, 2017-05-23 12:10:21

Utilisation de Mockito et PowerMockito:

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

Reportez-vous au lien pour le code complet.

 6
Author: Surekha, 2016-04-14 15:14:53

Écrire une classe appelée DateHelper avec une méthode getCalendar qui retourne Calendar.getInstance(). Refactorisez la classe que vous testez afin qu'elle ait une variable membre de type DateHelper et un constructeur qui injecte cette variable membre. Utilisez ce constructeur dans votre test, pour injecter un mock de DateHelper, dans lequel getCalendar a été tronqué pour renvoyer une date connue.

 2
Author: Dawood ibn Kareem, 2012-02-14 11:23:29

Vous pouvez mockit en utilisant JMockit. Ici vous pouvez voir comment vous pouvez faire cela: Maquette Java Calendrier - JMockit vs Mockito.

 1
Author: Behrang, 2012-09-04 10:23:07

Pour ceux qui suit le modèle MVP Calendrier moqueur est un morceau de gâteau:

  1. Dans un présentateur, créez une méthode qui renvoie une instance de calendrier:

     public Calendar getCurrentTime() {  
            return Calendar.getInstance();    
        }
    
  2. Dans votre vue (Activité, Fragment, etc.), vous accédez au calendrier à l'aide du présentateur:

     Calendar calendar = mPresenter.getCurrentTime();   
     // do whatever you want
    
  3. Dans vos tests, vous faites:

     // create a dummy calendar   
     Calendar mockCalendar = ...   
     // You've already mocked your Presenter, haven't you?   
     when(mMockPresenter.getCurrentTime()).thenReturn(mockCalendar);   
     // here you are!
    
 0
Author: Leo Droidcoder, 2017-06-28 05:33:40