[JAVA] Comment fixer la date système dans JUnit

Je veux fixer la date du système

Lorsque j'entre dans la phase de test unitaire au travail, je souhaite souvent fixer la date. Cette fois, j'ai essayé de corriger l'heure en utilisant la bibliothèque Mock.

Prémisse: Quelle classe est la cible du test? ??

Cette fois, j'écrirai un JUnit pour tester ce qui suit.

public class OutputDate {
    public void getDate(){
    	SimpleDateFormat sdf = new SimpleDateFormat("aaaa année MM mois jj jour hh heure mm minute ss seconde SSS milliseconde");
    	System.out.println(sdf.format(new Date()));
    }
}

Si tout se passe bien, la date et l'heure affichées par new Date () devraient être corrigées!

Tout d'abord, Power Mock!

J'ai appris de mon patron que cela peut être réalisé par les méthodes suivantes.

@RunWith(PowerMockRunner.class)
@PrepareForTest({OutputDate.class, Date.class})
public class FixSysDateUsingPowerMock1 {

	OutputDate output = new OutputDate();

	@Before
	public void setUp(){
		setDatemock();
	}


	@Test
	public void test() {
		output.getDate();
	}

	/**
	 *Fixer la date du système
	 *Cette méthode ne peut pas corriger jusqu'à la milliseconde
	 */
	private static void setDatemock(){
		Calendar cal = Calendar.getInstance();
		//Réglez l'heure à 10:10:10 le 1 janvier 2018(0 est janvier)
		cal.set(2018, 0,1,10,10,10);
		try {
			PowerMockito.whenNew(Date.class).withNoArguments().thenReturn(cal.getTime());
			when(new Date()).thenReturn(cal.getTime());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Il s'agit d'une méthode pour essayer de corriger en utilisant la méthode set () de la classe Calendar avec la méthode setDatemock (). Au début, je pensais que c'était bien, mais ** je ne peux pas réparer la milliseconde avec ça. ** Il n'y a rien à spécifier jusqu'à la milliseconde avec la méthode set (dans la plage que j'ai recherchée).

Je veux sortir jusqu'à la milliseconde avec PowerMock ...

Je me demandais quoi faire, mais je me demande si je peux bien le faire avec des chaînes de caractères? Sur la base de l'indication de mon patron, j'ai proposé la méthode suivante.


@RunWith(PowerMockRunner.class)
@PrepareForTest({ OutputDate.class, Date.class })
public class FixSysDateUsingPowerMock2 {

	OutputDate output = new OutputDate();

	@Before
	public void setUp() {
		setDatemock();
	}

	@Test
	public void test() {
		output.getDate();
	}

	/**
	 *Fixer la date du système
	 *Cette méthode corrige jusqu'à la milliseconde
	 */
	private static void setDatemock() {
		String strDate = "2018-01-01 10:10:10.111";
		//Réglez l'heure à 10:10:10 le 1 janvier 2018(Le mois est 0 en janvier)
		SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
		try {
			PowerMockito.whenNew(Date.class).withNoArguments().thenReturn(sdFormat.parse(strDate));
			when(new Date()).thenReturn(sdFormat.parse(strDate));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Il s'agit d'une méthode de conversion forcée de la date et de l'heure que vous souhaitez corriger d'une chaîne de caractères au format Date. De cette façon, j'ai pu corriger la milliseconde. Toutes nos félicitations ...

Est-il possible de fixer la date et l'heure avec JMockit?

J'ai été complètement soulagé par la méthode ci-dessus, mais j'ai eu un problème lorsque j'ai eu la couverture. Il semble que l'outil "Eclemma" utilisé pour obtenir une couverture dans Eclipse ne fonctionne pas bien lorsque PowerMockRunner.class est spécifié dans le testeur. Cela semble être un problème connu, et il semble qu'il puisse être résolu en utilisant @Rule comme indiqué ci-dessous.

Cliquez ici pour savoir comment obtenir une couverture avec Eclemma en utilisant PowerMock → https://code.i-harness.com/ja/q/1647e8c

Cependant, au moment du test unitaire, je cherchais avec impatience une autre méthode. Ensuite, j'ai proposé la méthode suivante en utilisant la bibliothèque JMockit.

@RunWith(JMockit.class)
public class FixSysDateUsingJMockit {

	//Vous devez ajouter de la statique privée
	@Mocked
	private static OutputDate output = new OutputDate();

	@Before
	public void setUp() throws Exception{
		setDatemock();
	}

	@Test
	public void test() {
		output.getDate();
	}

	private  void setDatemock() throws Exception {
		String strDate = "2018-01-01 10:10:10.111";
		SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
		new CurrentTimeMock(sdFormat.parse(strDate));
	}

	/**
	 *cours de simulation de date
	 */
	public static class CurrentTimeMock extends MockUp<System>{
		Date mockTime;

		public CurrentTimeMock(Date mockTime){
			this.mockTime = mockTime;
		}

		@Mock
		public long currentTimeMillis(){
			return mockTime.getTime();
		}
	}

Je suis content d'avoir pu fixer la date et obtenir une couverture!

Recommended Posts

Comment fixer la date système dans JUnit
Comment exécuter JUnit dans Eclipse
Comment filtrer JUnit Test dans Gradle
Comment obtenir la date avec Java
JUnit 5: Comment écrire des cas de test dans enum
Comment utiliser JUnit (débutant)
Comment écrire une recherche de comparaison de dates dans Rails
Comment écrire Junit 5 organisé
[Création] Comment utiliser JUnit
Comment sélectionner une date spécifiée par code dans le calendrier FS
Comment utiliser Lombok au printemps
Comment itérer indéfiniment en Ruby
Comment exécuter Ant dans Gradle
Comment maîtriser la programmation en 3 mois
Comment apprendre JAVA en 7 jours
Comment obtenir des paramètres dans Spark
Comment installer Bootstrap dans Ruby
Comment utiliser InjectorHolder dans OpenAM
Comment installer jQuery dans Rails 6
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment définir Lombok dans Eclipse
Comment concaténer des chaînes avec Java
Comment installer Swiper in Rails
Comment réparer les caractères japonais JAVA (y compris Arduino IDE)
Comment penser la conception de classe (division) dans un système d'entreprise (1)
[swift5] Comment spécifier la couleur en hexadécimal
Comment implémenter la fonctionnalité de recherche dans Rails
Comment implémenter le filtre de Kalman par Java
Comment changer le nom de l'application dans les rails
Comment utiliser le volume nommé dans docker-compose.yml
Comment insérer une vidéo dans Rails
Comment normaliser le pied de page d'en-tête dans Thymeleaf
Comment ajouter un fichier jar dans ScalaIDE
Comment utiliser Docker dans VSCode DevContainer
Comment utiliser MySQL dans le didacticiel Rails
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
[rails] Comment configurer le routage dans les ressources
Comment implémenter la fonctionnalité de classement dans Rails
Comment utiliser les variables d'environnement dans RubyOnRails
Comment tester l'étendue privée avec JUnit
Comment implémenter le traitement asynchrone dans Outsystems
Comment publier une bibliothèque dans jCenter
Comment spécifier l'attribut id dans JSF
Comprendre en 5 minutes !! Comment utiliser Docker
Comment écraser les données Firebase avec Swift
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
Comment assembler JSON directement dans Jackson
[Pour les débutants] Comment déboguer avec Eclipse
Comment utiliser ExpandableListView dans Android Studio
Comment afficher les messages d'erreur en japonais