Wenn ich bei der Arbeit in die Unit-Test-Phase eintrete, möchte ich häufig das Datum festlegen. Dieses Mal habe ich versucht, die Zeit mithilfe der Mock-Bibliothek zu bestimmen.
Dieses Mal werde ich eine JUnit schreiben, um Folgendes zu testen.
public class OutputDate {
public void getDate(){
SimpleDateFormat sdf = new SimpleDateFormat("JJJJ Jahr MM Monat TT Tag HH Stunde MM Minute SS Sekunde SSS Millisekunde");
System.out.println(sdf.format(new Date()));
}
}
Wenn alles gut geht, sollten Datum und Uhrzeit von new Date () festgelegt werden!
Ich habe von meinem Chef gelernt, dass dies mit den folgenden Methoden erreicht werden kann.
@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();
}
/**
*Systemdatum festlegen
*Diese Methode kann nicht bis zu Millisekunden behoben werden
*/
private static void setDatemock(){
Calendar cal = Calendar.getInstance();
//Stellen Sie die Zeit am 1. Januar 2018 auf 10:10:10 ein(0 ist Januar)
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();
}
}
Dies ist eine Methode zum Beheben mit der set () -Methode der Calendar-Klasse mit der setDatemock () -Methode. Zuerst dachte ich, das wäre in Ordnung, aber ** ich kann die Millisekunde damit nicht reparieren. ** Mit der set-Methode (in dem von mir gesuchten Bereich) kann bis zu Millisekunden nichts angegeben werden.
Ich habe mich gefragt, was ich tun soll, aber ich frage mich, ob ich mit Zeichenketten gut umgehen kann. Basierend auf dem Hinweis meines Chefs habe ich die folgende Methode entwickelt.
@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();
}
/**
*Systemdatum festlegen
*Diese Methode behebt bis zu Millisekunden
*/
private static void setDatemock() {
String strDate = "2018-01-01 10:10:10.111";
//Stellen Sie die Zeit am 1. Januar 2018 auf 10:10:10 ein(0 ist Januar)
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();
}
}
Dies ist eine Methode zum erzwungenen Konvertieren des Datums und der Uhrzeit, die Sie korrigieren möchten, von einer Zeichenfolge in das Datumsformat. Auf diese Weise konnte ich die Millisekunde korrigieren. Herzliche Glückwünsche ...
Ich war durch die obige Methode völlig erleichtert, aber ich hatte ein Problem, als ich die Berichterstattung bekam. Es scheint, dass das Tool "Eclemma", das zum Abrufen der Abdeckung in Eclipse verwendet wird, nicht gut funktioniert, wenn PowerMockRunner.class im Testläufer angegeben ist. Es scheint ein bekanntes Problem zu sein, und es scheint, dass es mit @Rule wie unten gezeigt gelöst werden kann.
Klicken Sie hier, um Informationen zu Eclemma mithilfe von PowerMock zu erhalten → https://code.i-harness.com/ja/q/1647e8c
Zum Zeitpunkt des Unit-Tests suchte ich jedoch eifrig nach einer anderen Methode. Dann habe ich die folgende Methode mit der JMockit-Bibliothek entwickelt.
@RunWith(JMockit.class)
public class FixSysDateUsingJMockit {
//Sie müssen private statische hinzufügen
@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));
}
/**
*Datum Scheinklasse
*/
public static class CurrentTimeMock extends MockUp<System>{
Date mockTime;
public CurrentTimeMock(Date mockTime){
this.mockTime = mockTime;
}
@Mock
public long currentTimeMillis(){
return mockTime.getTime();
}
}
Ich bin froh, dass ich das Datum festlegen und Berichterstattung erhalten konnte!
Recommended Posts