FileWriter / FileReader testen / Mock-Objekt für Unit Tests?

B

bananenkasper

Gast
Hallo zusammen,

Ich habe ein paar Klassen geschrieben, um bestimmte Dateiformate zu schreiben und zu lesen.
Die Dateiformate sind alle Plain-Text, dh. die Basisklasse für alle Reader und Writer schreibt- bzw. liest einen einfachen String.

Ich teste per JUnit und möchte in den Tests nicht wirklich auf Platte schreiben, bzw. von Platte lesen.
Vielmehr würde ich lieber das Lesen-/Schreiben irgendwie mocken.

Meine Frage: How to mock java.io.File?
Ist das überhaupt möglich?
Was nicht funktioniert:
Java:
@Before
	public void setUp() throws Exception {
		fileMock = EasyMock.createMock(File.class);
	}

@Test
@Ignore("How to mock java.io.File?")
	public final void testWriteFile() throws IOException {
		EasyMock.expect(fileMock.getPath()).andReturn("bla");
		EasyMock.expect(fileMock.exists()).andReturn(true);
		EasyMock.expect(fileMock.canRead()).andReturn(true);
		EasyMock.expect(fileMock.isFile()).andReturn(true);
		EasyMock.replay(fileMock);
		new LazyStringWriter("test-string").write(fileMock);
		EasyMock.verify(fileMock);
	}

Hierbei wird logischerweise ja die Datei tatsächlich geschreiben...
Das würde ich aber gern vermeiden...

Irgendwelche Ideen?

Viele Grüße
 
M

maki

Gast
Interessanter wäre hier der zu testende Code(LazyStringWriter.write), wieso wird die Datei wirklich geschrieben wenn du doch nur ein Mockfile übergibst?
 
B

bananenkasper

Gast
Java:
/**
 * A {@code LazyStringWriter} provides the ability to write a string quickly to
 * <ul>
 * <li>
 * a {@link File}</li>
 * <li>
 * a {@link Writer}</li>
 * <li>
 * an {@link OutputStream}</li>
 * </ul>
 * </p>
 * <p>
 * <b>Attention:</b> writing is not buffered! If you want to write large files,
 * consider to use {@link BufferedStringWriter} instead.
 * </p>
 * <p>
 * <b>Example:</b>
 * </p>
 * <pre>
 *  @Test
	public final void example() throws IOException {
		final StringWriter wr = new StringWriter();
		new LazyStringWriter(quot;Hallo Welt!quot;).write(wr);
		assertEquals(quot;Hallo Welt!quot;, wr.toString());
	}
 * </pre>
 * 
 * @author Alexander Kerner
 * @see File
 * @see Writer
 * @see OutputStream
 * @version 2010-09-10
 * 
 */
public class LazyStringWriter implements GenericWriter {

	private final String string;

	public LazyStringWriter(Object toString) {
		this.string = toString.toString();
	}

	// Implement //

	public void write(File file) throws IOException {
		if(!FileUtils.fileCheck(file, true))
			throw new IOException("cannot access file \"" + file + "\"");
		write(new FileWriter(file));
	}

	public void write(Writer writer) throws IOException {
		StringReader reader = null;
		try {
			reader = new StringReader(string.toString());
			IOUtils.readerToWriter(reader, writer);
		} finally {
			IOUtils.closeProperly(writer);
			IOUtils.closeProperly(reader);
		}
	}

	public void write(OutputStream stream) throws IOException {
			write(IOUtils.outputStreamToWriter(stream));
	}
}

..., wieso wird die Datei wirklich geschrieben wenn du doch nur ein Mockfile übergibst?

Ich bin kein IO-Experte, aber so wie ich das sehe, ist java.io.File nur ein Wrapper/Zeiger? für eine Position auf Platte.
Eigentlich nur ein String mit ein paar "extra-Funktionalitäten".

Jedenfalls zeigt mir der Mock-Test, dass auf das java.io.File Object ja nur folgende Methoden aufgerufen werden:

  • File.getPath();

    File.exists();

    File.canRead();

    File.isFile();
 
S

SlaterB

Gast
File zu mocken, was immer das bedeutet, bringt in dem Programm tatsächlich nix, File hat doch nichts zu sagen, interessant wirds mit

> public void write(Writer writer)
bzw. dem Aufruf
> write(new FileWriter(file));

FileWriter ist derjenige, der die Festplatte beschmutzt, den musst du mocken, den ganzen Test so aufbauen, dass statt File ein Writer übergeben wird,
was auf die Methode
> public void write(Writer writer)
ja schon zutrifft

die andere ist bedenklich, dort vielleicht File + Writer übergeben, aber wenn ein neuer FileWriter erstellt wird kann logischerweise kaum eingegriffen werden,

---------

der ganze File-Check in der Methode,
> if(!FileUtils.fileCheck(file, true))
usw. ist übrigens recht absurd wenn das Mock-File ungeprüft true zurückgibt,
wozu eigentlich der Test wenn letztlich die Haupt-Aktion der Methode, Schreiben auf die Festplatte, gar nicht durchgeführt wird?
dann lieber gar nicht testen.. oder willst du nur mögliche NullPointerException-Bugs jagen?
 
Zuletzt bearbeitet von einem Moderator:
B

bananenkasper

Gast
FileWriter ist derjenige, der die Festplatte beschmutzt, den musst du mocken, den ganzen Test so aufbauen, dass statt File ein Writer übergeben wird,
was auf die Methode
> public void write(Writer writer)
ja schon zutrifft

Das stimmt wohl! Guter Ansatz, werde ich mal testen.

EDIT:
Java:
@Test
	public final void testWriteWriter() throws IOException {
		final java.io.StringWriter wr = new java.io.StringWriter();
		new LazyStringWriter(s1).write(wr);
		assertEquals(s1, wr.toString());
	}
Das klappt schonmal, brauche ich nicht mal zu mocken.
Aber damit habe ich ja nicht die write(java.io.File) Methode getestet...


der ganze File-Check in der Methode,
> if(!FileUtils.fileCheck(file, true))
usw. ist übrigens recht absurd wenn das Mock-File ungeprüft true zurückgibt,
wozu eigentlich der Test wenn letztlich die Haupt-Aktion der Methode, Schreiben auf die Festplatte, gar nicht durchgeführt wird?
dann lieber gar nicht testen.. oder willst du nur mögliche NullPointerException-Bugs jagen?


Öh, das verstehe ich jetzt nicht so ganz. Die Klasse ist ja nicht nur zum Testen da. Der test soll "im echten Leben" gucken ob die übergebene Datei lesbar ist. Oder spielst du auf das Boolean.TRUE an? Das hat damit nix zu tun, das legt nur die Datei an, falls sie noch nicht existiert (wenn true).
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> Die Klasse ist ja nicht nur zum Testen da. Der test soll "im echten Leben" gucken ob die übergebene Datei lesbar ist.

von Lesen sehe ich nicht viel, aber wenn du auf File.canRead() ansprichst na ok,
da kann ich jetzt spontan auch nicht wirklich sagen inwieweit das zu testen ist,

bei
> public void write(Writer writer)
hast du nun aber einen Test, der auch überprüft was am Ende geschrieben rauskommt, das finde ich gut, ja in der Richtung dachte ich,
nicht dass du einen Mock übergibst der den geschrieben Text einfach verschwinden läßt (statt auf die Festplatte),

und deine Methodenbeschreibung sagt ja auch, dass in einen beliebigen Stream geschrieben wird, nicht unbedingt eine Datei,
also keine Kritik mehr ;)
 
B

bananenkasper

Gast
Ja, gefällt mir auch schon ganz gut so ;) Also schonmal vielen Dank an dieser Stelle! :toll:

Bleibt nur noch ein Problem:
Effektiv teste ich nur eine von drei Methoden, was, je länger ich drüber nachdenke, auch OK ist, da die beiden anderen Methoden eh nur delegieren.
Aber:
So ist die Test-coverage ziemlich mickrig, das ist schlecht für die Statistik! ;)
Kann ich da noch was rausholen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K FileWriter / FileReader Allgemeine Java-Themen 12
H Dateien lesen und schreiben mit Filereader und Filewriter Allgemeine Java-Themen 2
KaffeeFan FileWriter nur leere Zeilen beschreiben Allgemeine Java-Themen 3
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
L Filewriter schreibt Zahlen in Textdatei Allgemeine Java-Themen 2
R Encoding FileWriter Allgemeine Java-Themen 1
G Mit FileWriter in Textdatei über jar Allgemeine Java-Themen 4
V FileWriter und Zahlen (Kein Problem, nur Verständnisfrage) Allgemeine Java-Themen 4
I Filewriter ignoriert Zeilenumbrüche Allgemeine Java-Themen 4
E Umlaute: FileWriter vs. FileOutputStream Allgemeine Java-Themen 3
C FileWriter zu laaaaaaaaaaaam Allgemeine Java-Themen 16
V Unterschied FileOutputStream und FileWriter? Allgemeine Java-Themen 8
H Frage zu FileWriter Allgemeine Java-Themen 12
D FileWriter, PrintWriter und wie sie alle heißen. Allgemeine Java-Themen 13
S Problem!FileWriter Allgemeine Java-Themen 3
G Problem mit FileWriter Allgemeine Java-Themen 7
H Mit filewriter farbigen text schreiben? Allgemeine Java-Themen 7
S FileWriter PrintWriter Allgemeine Java-Themen 5
G Mit FileWriter Zeilenumbruch schreiben Allgemeine Java-Themen 8
Master3000 JAVA Filereader Allgemeine Java-Themen 18
S FileReader-Problem in Eclipse Allgemeine Java-Themen 8
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
S Input/Output FileReader UTF-8 Datei Allgemeine Java-Themen 7
C OpenJDK - FileReader throws FileNotFoundException Allgemeine Java-Themen 19
G Kopie eines FileReader Allgemeine Java-Themen 4
U Filereader problem Allgemeine Java-Themen 2
S was passiert bei diesem filereader prozess Allgemeine Java-Themen 2
B HTML und FileReader Allgemeine Java-Themen 2
S FileReader Methode nach Zeilen. Allgemeine Java-Themen 2
Zrebna Zuverlässiges Automatisiertes Testen im eigenem Software-Unternehmen aufsetzen - How to? Allgemeine Java-Themen 12
Zrebna Automatisiertes Testen von größeren und komplexen Prozessen Allgemeine Java-Themen 56
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
Z Testen ob neuer Tag beginnt Allgemeine Java-Themen 37
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
B Eclipse WebSocket programmiert, kann es leider nicht testen. Allgemeine Java-Themen 15
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
perlenfischer1984 TestNG - Enum testen Allgemeine Java-Themen 1
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
F Testen von Methoden Allgemeine Java-Themen 3
B JUnit Zufalls Operation testen Allgemeine Java-Themen 1
P Testen von UIs Allgemeine Java-Themen 2
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
M Testen von verschiedenen Produktversionen Allgemeine Java-Themen 3
T EventBus testen Allgemeine Java-Themen 1
L JUnit - automatisiertes vs. manuelles Testen? Allgemeine Java-Themen 6
R Java Performance testen Allgemeine Java-Themen 18
B Mails testen Allgemeine Java-Themen 7
A AVL-Baum - Testen ob einer vorliegt Allgemeine Java-Themen 4
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
J JUnit - werfen von Exceptions testen Allgemeine Java-Themen 17
X Testen ob ein array leer ist Allgemeine Java-Themen 6
M Server-Responds testen, Code-Redundanz Allgemeine Java-Themen 3
fastjack Unit-Testen mit Mocks Allgemeine Java-Themen 6
H Thread Safety und Deadlocks testen Allgemeine Java-Themen 6
D Muss eine JNI Biblio testen (MAC OS X) Allgemeine Java-Themen 4
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
aokai Testen von Klassen die abhängig von Stdlibs URL sind Allgemeine Java-Themen 3
S Testen einer Anwendung durch klicken von Koordinaten Allgemeine Java-Themen 7
R Testen von Applets - versch. Browser und Java Versionen? Allgemeine Java-Themen 4
V Quellcode auf "Güte" testen? Allgemeine Java-Themen 5
G JAR-DAtei testen Allgemeine Java-Themen 15
J Klasse auf Konstruktor oder Methode testen? Allgemeine Java-Themen 3
A Junit Exceptions testen Allgemeine Java-Themen 3
Z Testen welches BS benutzt wird Allgemeine Java-Themen 3
G Testen von RMI,TCP/IP, Servlets etc. Allgemeine Java-Themen 2
M Welches Linux zum Java testen? Allgemeine Java-Themen 5
P Testen mit JUnit Allgemeine Java-Themen 8
L Java6 update N bekommt neues Browser-Plugin, bitte testen. Allgemeine Java-Themen 7
G testen mit JUnit? Allgemeine Java-Themen 3
K Testen ob Methode existiert? Allgemeine Java-Themen 2
N Cashbook Management Testen Allgemeine Java-Themen 7
A testen ob Primzahl dauert bei größeren zahlen extrem lange Allgemeine Java-Themen 8
M String testen? Allgemeine Java-Themen 2
M String testen? Allgemeine Java-Themen 6
N auf typ testen? Allgemeine Java-Themen 3
M Programmierstill: Bitte testen anhand HTML-Tool Allgemeine Java-Themen 18
K Testen einer Klasse mit File Objekt als Parameter Allgemeine Java-Themen 6
M Bitte Testen: Mein Multi-File Editor Allgemeine Java-Themen 30
T GUI Testen Allgemeine Java-Themen 4
T GUI Testen Allgemeine Java-Themen 5
G Programm zum Testen der Striktheit von Java Allgemeine Java-Themen 9
H Laufwerk testen? Allgemeine Java-Themen 12
F Hilfe: Adjazenzmatrix mittels JUnit testen. Allgemeine Java-Themen 2
M Jemannd mit 1.4/1.3/1.2 zum Testen gesucht. Allgemeine Java-Themen 15
flashfactor Testen ob ein R/3 erreichbar bzw. noch am leben ist. Allgemeine Java-Themen 2
T Datum testen und Einsetzten Allgemeine Java-Themen 5
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
P Dateinamen mit regulärem Ausdruck testen Allgemeine Java-Themen 9
P Dateinamen testen? Schreibrechte auf Verzeichnis testen? Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben