Bitte geben Sie Zeiger an, damit ich das Java InputStream-Objekt verspotten kann. Dies ist die Codezeile, die ich verspotten möchte:
InputStreamReader inputData = new InputStreamReader(System.in);
bufferdReader = new BufferedReader(inputData);
bufferdReader.readLine();
Antworten:
BufferedReader bufferedReader = org.mockito.Mockito.mock(BufferedReader.class); when(bufferedReader.readLine()) .thenReturn("first line") .thenReturn("second line"); org.junit.Assert.when(new Client(bufferedReader).parseLine()) .thenEquals(IsEqual.equalTo("first line"));
quelle
Client
? Es tut mir leid, aber ich bin neu in Mockito und Junit. Sie verwenden Client in dieser Zeile:org.junit.Assert.when(new Client(bufferedReader).parseLine())
Sie können commons-io verwenden , um einige Stub-Eingabestreams zu erstellen:
InputStream stubInputStream = IOUtils.toInputStream("some test data for my input stream", "UTF-8");
quelle
toInputStream("someString", "UTF-8")
. Die Version mit nur String als Parameter ist veraltet.StandardCharsets.UTF_8
Sie können einfach a verwenden
ByteArrayInputStream
und es mit Ihren Testdaten füllen.@ Brads Beispiel aus den Kommentaren:
InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
quelle
ByteArrayInputStream
unterstütztmark()
undreset()
InputStream anyInputStream = new ByteArrayInputStream("test data".getBytes());
Ich bin mit der ausgewählten Antwort auf diese Frage nicht einverstanden. Mocking-Frameworks wie Mockito sind nett und alle, aber wenn Standard-Java-API verfügbar ist, können Sie dies stattdessen in Betracht ziehen.
dh
BufferedReader reader = new BufferedReader(new StringReader("some string"));
Warum sollten Sie in Ihren Testklassen ein Mock-Objekt verwenden, wenn Sie ein reales Objekt mit all seinem Status und Verhalten verwenden könnten?
Um mehr darüber zu erfahren, wie dies funktioniert, können Sie das Designmuster "Dekorateur" nachschlagen.
quelle
Ändern Sie Ihr Objekt so, dass es einfacher zu testen ist.
public MyObject { private InputStream inputStream; public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;} public void whatever() { InputStreamReader inputData = new InputStreamReader(inputStream); bufferdReader = new BufferedReader(inputData); bufferdReader.readLine(); } }
Wenn Sie dann Ihr Objekt verwenden, initialisieren Sie zuerst seinen inputStream:
MyObject myObject = new MyObject(); myObject.setInputStream(System.in);
Jetzt haben Sie ein Objekt, mit dem Sie es mit einer beliebigen Implementierung von InputStream testen können (ByteArrayInputStream ist ein guter Versuch).
quelle
@Test public void testReadFile() { TestClass ClassName = Mockito.mock(TestClass.class); InputStream in = Mockito.mock(InputStream.class); InputStreamReader inr =Mockito.mock(InputStreamReader.class); BufferedReader bufferedReader =Mockito.mock(BufferedReader.class); try { PowerMockito.whenNew(InputStreamReader.class).withArguments(in).thenReturn(inr); PowerMockito.whenNew(BufferedReader.class).withArguments(inr).thenReturn(bufferedReader); String line1 = "example line"; PowerMockito.when(bufferedReader.readLine()).thenReturn(line1).thenReturn(null); method return type = Whitebox.invokeMethod(ClassName, "MethodName", arguement); assertEquals("result is::","expected", actual); } catch (Exception e) { e.printStackTrace(); } }
quelle
String testString = "test\nstring"; InputStream stream = new ByteArrayInputStream(testString.getBytes(StandardCharsets.UTF_8)); BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); Assert.assertEquals("test", reader.readLine()); Assert.assertEquals("string", reader.readLine());
quelle
Die beste Lösung, die ich gefunden habe, ist die Verwendung
final InputStream inputStream1 = IOUtils.toInputStream("yourdata");
und wickeln Sie dann den Inpustream in bufferedReader ein, um den Test am besten um den Eingabestream zu schreiben
quelle
Angenommen, Sie verwenden Maven, können Sie eine Ressource in den Ordner "src / test / resources /" legen, beispielsweise "src / test / resources / wunderbar-mock-data.xml ". Dann können Sie in Ihnen Folgendes tun:
String resourceInputFile = "/database-insert-test.xml"; URL url = this.getClass().getResource(resourceInputFile); Assert.assertNotNull("Can't find resource " + resourceInputFile, url); InputStream inputStream = url.openStream(); // Now you can just use the inputStream for method calls requiring this param (...)
In diesem Beispiel ist die URL varialble null, wenn die angegebene Ressource im aktuellen Klassenpfad nicht gefunden werden kann. Mit diesem Ansatz können Sie mehrere Szenarien in verschiedene resourceInputFile (s) einfügen ... Denken Sie auch daran, dass alle Arten von Ressourcen unter "src / test / resources /" (nicht nur XML-Dateien, wie z. B. txt, html, jpeg usw.) gespeichert sind. ) sind normalerweise als Klassenpfadressourcen aus allen jUnit-Tests verfügbar.
quelle
Referenz http://www.javased.com/?api=org.mockito.Matchers
quelle