Ich habe eine Klasse wie die folgende;Mock ein privates statisches Feld mit JMockit?
class ClassA {
private static File myDir;
// myDir is created at some stage
private static String findFile(final String fileName) {
for (final String actualBackupFileName : myDir.list()) {
if (actualBackupFileName.startsWith(removeExtensionFrom(backupFile))) {
return actualBackupFileName;
}
}
}
}
Also, im Grunde möchte ich diese Klasse testen, indem Sie die File-Klasse verspotten, so dass, wenn die Liste() auf sie aufgerufen wird es eine Liste von Strings zurück, die ich in meiner Test-Klasse definieren.
Ich habe die folgenden, aber es funktioniert nicht in der Minute, es ist wahrscheinlich etwas offensichtlich Ich mache falsch - ich bin neu bei JMockit - jede Hilfe wird sehr geschätzt!
@Mocked("list") File myDir;
@Test
public void testClassA() {
final String[] files = {"file1-bla.txt"};
new NonStrictExpectations() {{
new File(anyString).list();
returns(files);
}};
String returnedFileName = Deencapsulation.invoke(ClassA.class, "findFile","file1.txt");
// assert returnedFileName is equal to "file1-bla.txt"
}
Bei der Ausführung des obigen Test ich eine Nullpointer für das myDir Feld in KlasseA bekommen - so sieht es aus wie es ist nicht richtig verspottet zu werden?
Excellent, tausend Dank für deine Hilfe Rogerio, das hat mit einer kleinen Änderung an deinem Code funktioniert - @Mocked File myDir musste in @Mocked geändert werden (methods = {"list"}) File myDir um es zum Laufen zu bringen. Ich denke, das war vielleicht, weil der Deencapsualtion.invoke-Aufruf vielleicht irgendwann ein reelles File-Objekt benötigt, und alle Methoden zu verspotten schien etwas zu stören. Ich bin ein neuer Benutzer, also kann ich dich nicht abstimmen - sonst würde ich! – user2586917
Großartig! Die Verspottung 'Datei' kann tatsächlich zu unerwarteten Fehlern führen, zumindest in älteren Versionen von JMockit. Ich habe die Antwort mit deinen Änderungen bearbeitet. –
@ Rogério, der obige Weg, ein Mock-Objekt ('myDir') zu erzeugen, führt dazu, dass der Verweis' null' ist, was dazu führt, dass 'myDir.list()' mit einem 'NPE' fehlschlägt. Irgendeine Idee warum? – mystarrocks