Ich habe eine Ressourcendatei mit einigen Einstellungen. Ich habe eine ResourceLoader-Klasse, die die Einstellungen aus dieser Datei lädt. Diese Klasse ist derzeit eine eifrig instanziierte Singleton-Klasse. Sobald diese Klasse geladen wird, liest sie die Einstellungen aus der Datei (Dateipfad, der als konstantes Feld in einer anderen Klasse gespeichert ist). Einige dieser Einstellungen sind nicht für Unit-Tests geeignet. ZB habe ich in dieser Datei eine Thread-Ruhezeit, die Stunden für den Produktionscode betragen kann, aber ich möchte, dass sie für Unit-Tests einige Millisekunden beträgt. Ich habe also eine andere Testressourcendatei, die andere Werte hat. Meine Frage ist, wie ich beim Testen von Einheiten die Hauptressourcendatei mit dieser Testdatei austauschen soll. Das Projekt ist ein Maven-Projekt und ich verwende testng als Test-Framework. Dies sind einige der Ansätze, die ich '
Verwenden Sie @BeforeSuite und ändern Sie die Konstantenvariable FilePath so, dass sie auf die Testdatei verweist. Verwenden Sie @AfterSuite, um sie wieder auf die Originaldatei zu verweisen. Dies scheint zu funktionieren, aber ich denke, da die ResourceLoader-Klasse eifrig instanziiert wird, gibt es keine Garantie dafür, dass die @ BeforeSuite-Methode immer ausgeführt wird, bevor die ResourceLoader-Klasse geladen wird, und daher möglicherweise alte Eigenschaften geladen werden, bevor der Dateipfad geändert wird. Obwohl die meisten Compiler eine Klasse nur laden, wenn dies erforderlich ist, bin ich mir nicht sicher, ob dies eine Java-Spezifikationsanforderung ist. Theoretisch funktioniert dies möglicherweise nicht für alle Java-Compiler.
Übergeben Sie den Pfad der Ressourcendatei als Befehlszeilenargument. Ich kann den Pfad der Testressourcendatei als Befehlszeilenargument in der todsicheren Konfiguration im POM hinzufügen. Das scheint etwas übertrieben.
Verwenden Sie den Ansatz in 1. und machen Sie ResourceLoader faul instanziiert. Dies garantiert, dass ResourceLoader die richtige Datei lädt, wenn @BeforeMethod vor dem ersten Aufruf von ResourceLoader.getInstance (). GetProperty (..) aufgerufen wird. Dies scheint besser zu sein als die ersten beiden Ansätze, aber ich denke, dass es hässlich ist, eine Singleton-Klasse faul instanziiert zu machen, da ich kein einfaches Muster wie eine Aufzählung und dergleichen verwenden kann (wie es bei eifriger Instanziierung der Fall ist).
Dies scheint ein häufiges Szenario zu sein. Wie geht man am häufigsten vor?