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.
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!
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 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 ...
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