Ich habe meine Klasse alsWie sich ändern Werte von „private static final String filePath“ für Unittesting
public class MappingLoader
{
private static final String filepath = "/tmp/mapping.properties" // unix path of production system
private static Map<String,String> mapping = new HashMap<String,String>()
static
{
loadMappingFile()
}
@VisibleForTesting
static void loadMappingFile()
{
//reading properties files here
final Properties prop = new Properties();
try (final InputStream input = Files.newInputStream(Paths.get(filepath)))
{
prop.load(input);
}
catch (final Exception e)
{
...
...
throw new RuntimeException(e);
}
//now load "mapping" from properties file
....
....
}
}
Zum Testen, ich brauche den Wert der String-Variable „filepath“ so ändern, dass sie die Entwicklung nehmen sollte Systempfad (zB c: \ project \ target \ mapping.properties)
Ich habe versucht Powermocks in Junits, aber es wirft immer Ausnahme und beendet.
Anmerkungen auf Klassenebene:
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("some.package.ClassWithStaticInit")
und in Testfall:
Whitebox.setInternalState(Mappingloader.class, "filepath", testfilepath);
Mappingloader.loadMappingFile();
Ich habe auch versucht, in (Change private static final field using Java reflection) als gegeben dies durch Reflexion zu ändern, aber es wirft immer die FileNotFoundException für " Dateipfad "und nimmt nicht den geänderten Pfad" testFilePath "
Gibt es eine Möglichkeit, ich kann diese Variable so ändern, dass es FileNo nicht wirft tFoundException ohne Änderung im Quellcode?
Wenn ich "neue RuntimeException (e) löschen" entfernen im Quellcode funktioniert Powermocks für mich. Aber ich möchte dies erreichen, ohne Quellcode zu ändern, entweder über Powermock, Reflection API.
Ausgezeichnete Antwort! Ich stimme völlig zu, wie man testbaren Code entwickelt. Und noch mehr: Sobald Sie eine instanziierbare, wiederverwendbare und testbare Abstraktion haben, um eine Eigenschaftendatei zu lesen, gibt es nichts dagegen, eine statische Fassade zum Lesen einer bestimmten Datei zu verwenden. (Wenn die Abstraktion vollständig getestet wurde, muss die Fassade nicht getestet werden.) –
Gern geschehen. – GhostCat
@GhostCat, alles, was Sie gesagt haben, sind gut denkt und wie es sein sollte. Aber Sie haben nicht gesagt, wie es erreicht werden könnte, wenn ein Entwickler bereits solchen Code hat und vielleicht ein Teil der Bibliothek ist, der nicht geändert werden kann. Natürlich sollte ein Entwickler all diesen Prinzipien folgen, vermeiden Sie statische und so weiter, und so weiter, aber wenn ein Projekt von Grund auf neu gestartet wird. Wenn Code nicht durch Test abgedeckt wird - make change, ist es keine gute Idee. –