2012-04-10 3 views
3

Ich habe einen Komponententest, der sicher ein Objekt in meinem Beispiel machen prüft mit einem richtigen Datum bevölkert erstellt:Warum funktioniert Java Thread.sleep oder Date.after() auf anderen Computern anders?

Date earlier = new Date(); 
    Thread.sleep(10); 
    instance.execute(); 
    assertTrue(instance.getMyObject.getCreationDate().after(earlier)); 

Dieser Test für mich auf Windows 7 Java 6 funktioniert, wenn in Eclipse oder mit Ant läuft aus die Befehlszeile. Mein Client sagt jedoch, dass dieser Test für ihn fehlschlägt (er hat seine Umgebung nicht angegeben). Wie konnte das sein?

+0

'instance.getMyObject.getCreationDate()' welcher Code ersetzt das? –

+0

Es empfiehlt sich, das String-Argument von assertTrue zu verwenden, um einige Informationen zu drucken, die Ihnen helfen zu verstehen, warum beide Werte gleich/verschieden sind. – oers

Antwort

8

Unter Windows XP beträgt die Taktauflösung nur 1/60 Sekunde. Dies bedeutet, dass Sie 10 ms warten können und die Uhrzeit erscheint gleich. Ich würde die Zeit auf 100 bis 250 ms erhöhen.

3

System.currentTimeMillis hat eine unterschiedliche "Auflösung" auf verschiedenen Plattformen. Unter Windows kann es 15 ms sein - was bedeuten würde, dass Ihre Wartezeit von 10 ms nicht unbedingt zu einem "späteren" Datum führt.

Ich würde die Thread.sleep(10) zu Thread.sleep(100) oder mehr erhöhen.

1

Wie Peter Lawrey geantwortet hat, könnte die Auflösung der Systemuhr bedeuten, dass zwischen der Erstellung Ihres "früheren" Datums und des Instanzdatums nicht aktualisiert wurde. ändern Vielleicht ist Ihr Code wie folgt:

assertFalse(instance.getMyObject.getCreationDate().before(earlier)); 

So sind Sie überprüfen, dass es auf jeden Fall nicht vor Ihrem früheren Zeitpunkt, und Sie brauchen sich keine Gedanken darüber machen, ob die Systemuhr aktualisiert hat oder nicht.