Was ich tun möchte, ist neu erstellte Instanz von BufferedReader
zu verspotten. Hier ist der Code, der getestet werden soll:PowerkMocking BufferedReader läuft intermittierend
A.java
...
@Override
public String read(String fileName) throws IOException {
...
try {
fileReader = new FileReader(fileName);
bufferedReader = new BufferedReader(fileReader);
String tmp;
StringBuilder builder = new StringBuilder();
while ((tmp = bufferedReader.readLine()) != null) {
builder.append(tmp);
}
return builder.toString();
} catch (IOException e) {
...
} finally {
...
}
}
...
Was ich zu tun haben, ist sowohl FileReader
Schöpfung und BufferedReader
Schöpfung PowerMock.
ATest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class ATest {
@Mock
private FileReader fileReader;
@Mock
private BufferedReader bufferedReader;
...
@Test
public void test() throws Exception {
PowerMockito.whenNew(FileReader.class).withArguments(FILE_NAME).thenReturn(fileReader);
PowerMockito.whenNew(BufferedReader.class).withAnyArguments().thenReturn(bufferedReader);
PowerMockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) throws Throwable {
return "test";
}
}).when(bufferedReader).readLine();
assertArrayEquals(reader.read(FILE_NAME), new String[]{"test"});
}
}
Aber dann der Test endet nie. Ich kann es nicht einmal debuggen.
Sobald PowerMockito.doAnswer()
entfernt wird, wird der Code ausgeführt (und ist zum Debuggen verfügbar). Ich habe auch versucht, Mockito.mock()
statt PowerMockito.doAnswer()
zu verwenden, es hilft nicht.
Was kann zu einer zwischenzeitlichen Ausführung des Tests führen?
Danke, macht Sinn. – azizbekian
Sie sind herzlich willkommen. Ich bin immer froh, wenn die Leute nicht auf solche Antworten mit "Aber es ist nicht mein Code, den ich testen muss, so PowerMock ist die einzige Wahl für mich" ;-) – GhostCat
Und nur als Randnotiz: Es gibt FileUtilities.readAllLines () - nimmt eine Zeichenkette und gibt eine Liste aller Zeilen in dieser Datei zurück (die Sie leicht eingeben könnten, um eine einzelne Zeichenkette zu erhalten). Vielleicht könnte man statt eines zehnten Mal "full read in string" auch nur eine der vorhandenen Implementierungen verwenden. Ich bin mir sicher, Apache Commons, Guave, sie alle haben Methoden dafür! – GhostCat