Simulazione input JUnit

di il
3 risposte

Simulazione input JUnit

Vorrei simulare l'input da tastiera in un test JUnit4

Nel main viene fatta una richiesta e viene aperto uno stream in input così(da manuale insomma):

BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
e si aspetta inizialmente un input, poi degli altri.

Ho pensato che facendo partire un Thread, all'interno del test, che invia sullo standard output delle stringhe, sarebbe andato bene; invece no

Il test sarebbe questo:

@Test
	public final void startNewConsoleGame() {
		ExecutorService executor = Executors.newCachedThreadPool();
		//BufferedWriter br=new BufferedWriter(new OutputStreamWriter(System.out));
		String[] c= {"0\r\n","0\n","1\n","1\n","0\n","1\n","1\n"};
		
		Thread t=new Thread(){
			int i=0;
			@Override
			public void run(){
				
				while(i!=c.length) {
					try {
						sleep(500);
						System.out.print(c[i]);
						System.out.flush();
						i++;
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
			}
		};
	    
		try {
			executor.execute(t);
			Main.main(null);			
		} catch (IOException e) {
			e.printStackTrace();
		}	
		
		AtomicInteger m=new AtomicInteger(0);
		Coordinator.getInstance().getPlayers().entrySet().stream().forEach(player->{
			assertEquals(0, player.getValue().showCardsInHand().showDeck().size());
			
			int i3=player.getValue().showCardsInHand().showDeck().size();
			int i5=player.getValue().showMyResult().showDeck().size();
			m.addAndGet((i3+i5));
		});
		
		int i1=Dealer.getInstance().getDeck().showDeck().size();
		int i2=Dealer.getInstance().getCardTable().showDeck().size();
		assertEquals(40, (i1+i2+m.get()));
	}

Il test di per se, ora, non è importante, la cosa importante è il thread; secondo voi dove sbaglio?

3 Risposte

  • Re: Simulazione input JUnit

    Risolvi banalmente con un StreamReader oppure un ByteArrayInputStream
  • Re: Simulazione input JUnit

    federaimondi ha scritto:


    Vorrei simulare l'input da tastiera in un test JUnit4
    Non è un buon approccio simulare l'input da tastiera per un test JUnit.

    federaimondi ha scritto:


    Ho pensato che facendo partire un Thread, all'interno del test, che invia sullo standard output delle stringhe, sarebbe andato bene; invece no
    Far partire un thread da un test JUnit .....brrrrr, nooo

    E poi, scusa, se scrivi su standard-output .. questo mica è (o va su) lo standard-input!


    E comunque, lo standard-input si può anche "redirezionare". System ha il setIn(InputStream in). E che InputStream ci metti? Lo puoi "implementare" tu da zero o (meglio) sfruttando altre classi di I/O!
  • Re: Simulazione input JUnit

    migliorabile ha scritto:


    Risolvi banalmente con un StreamReader oppure un ByteArrayInputStream
    Scusami, ma non ci arrivo proprio; un aiutino dal pubblico? Mi sto parecchio incartando.

    ho provato così ma nulla:
    @Override
    public void run(){

    while(i!=c.length) {
    try {
    sleep(500);

    System.setIn(new ByteArrayInputStream(c.getBytes()));
    scanner = new Scanner(System.in);
    System.out.println(scanner.nextLine());
    i++;

    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    scanner.close();
    System.setIn(System.in);
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte