2014-05-14 8 views
5

Gerade jetzt mehrere Benutzereingaben zu simulieren habe ich dieseWie für JUnit

ByteArrayInputStream in = new ByteArrayInputStream("2".getBytes()); 
System.setIn(in); 

//code that does something with user inputs 

Aber das Problem ist, dass in // Code, der etwas tut, ich mehrere Benutzereingabe aufgefordert haben, ist es möglich, eine Liste von zu bilden die Benutzereingabe und haben sie die entsprechende Eingabe wenn die Zeit kommt? Ich habe versucht, dumme Sachen wie "2 \ n2 \ n10 \ nHello \ n" .getBytes() zu machen, aber das hat nicht funktioniert.

EDIT:

ich meine Benutzereingabe mit einem Scanner Objekt erhalten:

Scanner inputScanner = new Scanner(System.in); 
inputScanner.nextLine(); 
+0

Details, wie Sie die Benutzereingabe erhalten - Code anzeigen? –

+0

@ AndersR.Bystrup bearbeitet Frage –

Antwort

2

doch einfach eine "neue Zeile" verwenden, sollte genug sein.

String simulatedUserInput = "input1" + System.getProperty("line.separator") 
    + "input2" + System.getProperty("line.separator"); 

InputStream savedStandardInputStream = System.in; 
System.setIn(new ByteArrayInputStream(simulatedUserInput.getBytes())); 

// code that needs multiple user inputs 

System.setIn(savedStandardInputStream); 
2

Sie mögen dies tun können:

  1. ein DelayQueue mit simuliertem Eingang Construct plus Verzögerungszeit.

  2. Erweitere BytArrayInputStream und überschreiben die read() Methode a DelayQueue zu lesen, wenn read() aufgerufen wird.

EDIT: Beispielcode (nicht vollständig umgesetzt - ist auf einem tel Treffen)

public class DelayedString implements Delayed { 

    private final long delayInMillis; 

    private final String content; 

    public DelayedString(long delay, String content) { 
     this.delayInMillis = delay; 
     this.content = content; 
    } 

    public String getContent() { 
     return content; 
    } 

    public long getDelay(TimeUnit timeUnit) { 
     return TimeUnit.MILLISECONDS.convert(delayInMillis, timeUnit); 
    } 
} 

public class MyInputStream implements InputStream { 

    private ByteBuffer buffer = ByteBuffer.allocate(8192); 

    private final DelayQueue<DelayString> queue; 

    public MyInputStream(DelayQueue<DelayString> queue) { 
     this.queue = queue; 
    } 

    public int read() { 
     updateBuffer(); 
     if (!buffer.isEmpty()) { 
      // deliver content inside buffer 
     } 
    } 

    public int read(char[] buffer, int count) { 
     updateBuffer(); 
     // deliver content in byte buffer into buffer 
    } 

    protected void updateBuffer() { 
     for (DelayedString s = queue.peek(); s != null;) { 
      if (buffer.capacity() > buffer.limit() + s.getContent().length()) { 
       s = queue.poll(); 
       buffer.append(s.getContent()); 
      } else { 
       break; 
      } 
     } 
    } 
} 
+0

Hmm, könnten Sie mir ein kleines Beispiel zur Verfügung stellen, mit zu arbeiten? Nicht ganz sicher, wie das geht. –

+0

Das ist viel komplizierter als das, was ich dachte, hah ... –

Verwandte Themen