2009-07-17 16 views
1

Mein Programm hat eine tägliche Routine ähnlich einem Wecker-Ereignis. Sag, wenn es 2 Uhr nachmittags ist (Die Zeit ist die Systemzeit in meinem PC), tu etwas für mich.Wie benutzt man Mock-Objekte, die ein tägliches Routineprogramm nachahmen?

Was ich tun möchte, ist die Testphase zu beschleunigen (ich möchte nicht wirklich 4 Tage warten auf die tägliche Routine und überprüfen Sie Fehler.) Ich las auf wiki of Mock object, der Schriftsteller DID erwähnt Wecker-Programm. Ich war so glücklich zu sehen, weiß aber immer noch nicht, wie ich es machen soll.

Ich bin neu in Mock Object, und ich programmiere in Java. Also könnte JMock oder EasyMock (oder irgendein ähnliches) für mich in Ordnung sein.

Dank

Antwort

4

Jedes Mal, wenn Sie die aktuelle Zeit bekommen müssen, nicht die Systemuhr direkt verwenden - eine Schnittstelle verwenden, wie zum Beispiel:

public interface Clock 
{ 
    long currentMillis(); 
} 

Anschließend können Sie diese für die Produktion mit einem Systemtakt implementieren, und übergibt eine Fälschung für Tests, wo Sie die Fälschung einstellen können, wann Sie wollen.

Sie müssen jedoch auch das System nachahmen, das Ihr System antreibt - warten Sie explizit auf eine bestimmte Zeit oder ruft etwas anderes Ihren Code an?

+0

Ich denke, Ihr Ansatz wird für meinen Fall funktionieren, cauz 'Ich warte einfach auf eine bestimmte Zeit für einige Routinearbeiten. – Lily

1

ich, da Sie über Java und ich bin zum Mittagessen gefragt haben müssen entschuldigen, wenn es um Java geht, aber eine Lösung ist, die Datetime-Objekt zu verspotten und es für die gewünschte Zeit einstellen .

In .NET wäre es so etwas wie folgt aussehen:

public static class SystemTime 
{ 
    public static Func<DateTime> Now =() => DateTime.Now; 
} 

SystemTime.Now =() => new DateTime(2000,1,1); 

Von: Dealing With Time In Tests


... [A] n Wecker-Programm, das bewirkt, dass ein Glocke zu läuten zu einer bestimmten Zeit könnte die aktuelle Zeit von außen Welt bekommen. Um dies zu testen, muss der Test warten, bis die Alarmzeit wissen, ob es die Glocke richtig geläutet hat. Wenn ein Mock-Objekt in Ort des realen Objekts verwendet wird, kann es programmiert werden, um die Glocke Zeit ( oder nicht) Bell bereitzustellen, so dass der Wecker Programm kann isoliert getestet werden .

Dieser Wecker, auf den Sie verweisen, gibt ein Beispiel für das Mocking eines Objekts. Es ist eigentlich kein Objekt, das Sie aus dem Mock-Framework verwenden können.

0

Grundsätzlich was Sie im Test tun, ist die Uhr Ereignisse fälschen. Genau wie hängt etwas vom Design ab, und wie Sie auf das Ereignis warten, aber um es einfach zu halten (wenn nicht rein) mein Ansatz würde eine Methode haben, die aufgerufen wird, wenn das Zeitereignis ausgelöst wird, und dann beide Seiten testen davon.

Zuerst testen Sie die Methode aufrufen und sehen, dass das zeitgesteuerte Ereignis das tut, was Sie erwarten. Dann verspotten Sie diese Klasse (mit JMock ist der bevorzugte Weg, es zu einer Schnittstelle zu machen und Ihre Aufrufmethode diese Schnittstelle zu implementieren).

Dann übergeben Sie den Schein an die Klasse, die das Timing behandelt.Auch hier würde ich die Threading-/Trigger-Probleme abstrahieren (z. B. die Systemuhr überprüfen und den Thread starten) und Mocks zurückgeben, die das Ereignis im Wesentlichen sofort ausführen.

Dann behalten Sie den echten Code, der tatsächlich die Systemuhr liest und startet den Thread so klein wie möglich, und das ist der Bereich, der nicht unter Unit-Test ist.

0

Mocking bezieht sich auf Unit-Tests. Für die Funktionalität, die Sie beschreiben, würde ich den Auslöser (in Ihrem Fall das Wecker-Ereignis) vom Prozess trennen (was auch immer Ihre "tägliche Routine" tut) und die Prozessfunktion testen.

Dann lenken Sie Ihre Aufmerksamkeit auf den Zeitplan-Code, der Ihre Prozessfunktionalität aufruft. Ich würde empfehlen, so etwas wie Quartz dafür zu verwenden, aber wenn Sie zu Rolle-Ihre-eigene gehen, kann der Komponententest für es mit der tatsächlichen Systemuhr arbeiten, vorausgesetzt, dass Sie die Auslösezeit basierend auf dem aktuellen Wert der Systemuhr zuweisen Alles, was Sie testen werden, ist, dass das Triggerereignis auftritt.

+0

Ich benutze Quarz ;-), und danke für deinen Rat. – Lily

+0

Cool, das macht es einfach :-) Kein Punkt in Quartz, nur testen Sie Ihre Funktionalität wie ich schlage vor. –