[JAVA] So beheben Sie das Systemdatum in JUnit

Ich möchte das Systemdatum festlegen

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.

Prämisse: Welche Klasse ist das Testziel? ??

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!

Zuallererst Power Mock!

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 möchte mit PowerMock bis zu Millisekunden ausgeben ...

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

Ist es möglich, Datum und Uhrzeit mit JMockit festzulegen?

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

So beheben Sie das Systemdatum in JUnit
So führen Sie JUnit in Eclipse aus
So filtern Sie den JUnit-Test in Gradle
So erhalten Sie das Datum mit Java
JUnit 5: Wie man Testfälle in enum schreibt
Verwendung von JUnit (Anfänger)
So schreiben Sie eine Datumsvergleichssuche in Rails
Wie schreibe ich Junit 5 organisiert
[Erstellen] Verwendung von JUnit
So wählen Sie ein bestimmtes Datum anhand des Codes im FS-Kalender aus
Wie man Lombok im Frühling benutzt
Wie man in Ruby auf unbestimmte Zeit iteriert
Wie man Ant in Gradle ausführt
Wie man die Programmierung in 3 Monaten beherrscht
Wie man JAVA in 7 Tagen lernt
So erhalten Sie Parameter in Spark
So installieren Sie Bootstrap in Ruby
Verwendung von InjectorHolder in OpenAM
So installieren Sie jQuery in Rails 6
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
So setzen Sie Lombok in Eclipse
So verketten Sie Zeichenfolgen mit Java
So installieren Sie Swiper in Rails
So beheben Sie japanische JAVA-Zeichen (einschließlich Arduino IDE)
Wie man über Klassengestaltung (Division) in einem Geschäftssystem nachdenkt (1)
[swift5] So legen Sie die Farbe hexadezimal fest
So implementieren Sie Suchfunktionen in Rails
So implementieren Sie den Kalman-Filter mit Java
So ändern Sie den App-Namen in Rails
Verwendung des benannten Volumes in docker-compose.yml
So fügen Sie ein Video in Rails ein
So standardisieren Sie die Kopfzeile in Thymeleaf
So fügen Sie eine JAR-Datei in ScalaIDE hinzu
Verwendung von Docker in VSCode DevContainer
Verwendung von MySQL im Rails-Tutorial
So erzwingen Sie Codierungskonventionen in Java
Einbetten von Janus Graph in Java
[Rails] So konfigurieren Sie das Routing in Ressourcen
So implementieren Sie Ranking-Funktionen in Rails
Verwendung von Umgebungsvariablen in RubyOnRails
So testen Sie den privaten Bereich mit JUnit
So implementieren Sie die asynchrone Verarbeitung in Outsystems
So veröffentlichen Sie eine Bibliothek in jCenter
So geben Sie das ID-Attribut in JSF an
Verstehe in 5 Minuten !! Wie man Docker benutzt
So überschreiben Sie Firebase-Daten mit Swift
Verwendung von credentials.yml.enc aus Rails 5.2
So montieren Sie JSON direkt in Jackson
[Für Anfänger] So debuggen Sie mit Eclipse
Verwendung von ExpandableListView in Android Studio
So zeigen Sie Fehlermeldungen auf Japanisch an