Тестирование программы командной строки невозможно, несмотря на использование обычных методов - PullRequest
0 голосов
/ 30 октября 2019

Я пытался написать тесты для моей программы, которая содержит несколько записей командной строки пользователем. Я пытался использовать совет, найденный здесь ( JUnit: Как имитировать тестирование System.in? ). Однако мне не повезло:

При использовании техники МакДауэлла выполнение теста вообще не дает слов командной строки - отладка показывает, что «приложение выполняется» без какой-либо дополнительной информации;Это приводит к тому, что цикл теста так и не завершается.

 @Test
    public void testExportingConversationExportsConversation() throws Exception {

        ConversationExporter exporter = new ConversationExporter();


        exporter.exportConversation("chat.txt", "chat.json");

        InputStream stdin = System.in;
        String data = "no";
        try {
            System.setIn(new ByteArrayInputStream(data.getBytes()));
            Scanner scanner = new Scanner(System.in);
            System.out.println(scanner.nextLine());
        } finally {
            System.setIn(stdin);
        }


        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Instant.class, new InstantDeserializer());



        Gson g = builder.create();

        Conversation c = g.fromJson(new InputStreamReader(new FileInputStream("chat.json")), Conversation.class);

        assertEquals("My Conversation", c.conversation_name);

        assertEquals(7, c.messages.size());

        Message[] ms = new Message[c.messages.size()];
        c.messages.toArray(ms);

        assertEquals(Instant.ofEpochSecond(1448470901), ms[0].unix_timestamp);
        assertEquals("bob", ms[0].username);
        assertEquals( "Hello there!", ms[0].message);

        assertEquals(Instant.ofEpochSecond(1448470905), ms[1].unix_timestamp);
        assertEquals("mike", ms[1].username);
        assertEquals( "how are you?", ms[1].message);

        assertEquals( Instant.ofEpochSecond(1448470906), ms[2].unix_timestamp);
        assertEquals( "bob", ms[2].username);
        assertEquals( "I'm good thanks, do you like pie?", ms[2].message);

        assertEquals(Instant.ofEpochSecond(1448470910), ms[3].unix_timestamp);

        assertEquals("mike", ms[3].username);
        assertEquals( "no, let me ask Angus...", ms[3].message);

        assertEquals( Instant.ofEpochSecond(1448470912), ms[4].unix_timestamp);
        assertEquals( "angus", ms[4].username);
        assertEquals( "Hell yes! Are we buying some pie?", ms[4].message);

        assertEquals( Instant.ofEpochSecond(1448470914), ms[5].unix_timestamp);
        assertEquals( "bob", ms[5].username);
        assertEquals( "No, just want to know if there's anybody else in the pie society...", ms[5].message);

        assertEquals( Instant.ofEpochSecond(1448470915), ms[6].unix_timestamp);
        assertEquals( "angus", ms[6].username);
        assertEquals("YES! I'm the head pie eater there...", ms[6].message);
    }

При использовании техники Антонио Винициуса Менезеса Медея происходит аналогичное событие с «запущенным» приложением без каких-либо выходов командной строки.

   @Before
    public void setUpOutput() {
        testOut = new ByteArrayOutputStream();
        System.setOut(new PrintStream(testOut));
    }

    public void provideInput(String data) {
        testIn = new ByteArrayInputStream(data.getBytes());
        System.setIn(testIn);
    }

    public String getOutput() {
        return testOut.toString();
    }



    /**
     * Tests that exporting a conversation will export the conversation correctly.
     * @throws Exception When something bad happens.
     */
    @Test
    public void testExportingConversationExportsConversation() throws Exception {

        ConversationExporter exporter = new ConversationExporter();


        exporter.exportConversation("chat.txt", "chat.json");
        provideInput("no");

        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Instant.class, new InstantDeserializer());



        Gson g = builder.create();

        Conversation c = g.fromJson(new InputStreamReader(new FileInputStream("chat.json")), Conversation.class);

        assertEquals("My Conversation", c.conversation_name);

        assertEquals(7, c.messages.size());

        Message[] ms = new Message[c.messages.size()];
        c.messages.toArray(ms);

        assertEquals(Instant.ofEpochSecond(1448470901), ms[0].unix_timestamp);
        assertEquals("bob", ms[0].username);
        assertEquals( "Hello there!", ms[0].message);

        assertEquals(Instant.ofEpochSecond(1448470905), ms[1].unix_timestamp);
        assertEquals("mike", ms[1].username);
        assertEquals( "how are you?", ms[1].message);

        assertEquals( Instant.ofEpochSecond(1448470906), ms[2].unix_timestamp);
        assertEquals( "bob", ms[2].username);
        assertEquals( "I'm good thanks, do you like pie?", ms[2].message);

        assertEquals(Instant.ofEpochSecond(1448470910), ms[3].unix_timestamp);

        assertEquals("mike", ms[3].username);
        assertEquals( "no, let me ask Angus...", ms[3].message);

        assertEquals( Instant.ofEpochSecond(1448470912), ms[4].unix_timestamp);
        assertEquals( "angus", ms[4].username);
        assertEquals( "Hell yes! Are we buying some pie?", ms[4].message);

        assertEquals( Instant.ofEpochSecond(1448470914), ms[5].unix_timestamp);
        assertEquals( "bob", ms[5].username);
        assertEquals( "No, just want to know if there's anybody else in the pie society...", ms[5].message);

        assertEquals( Instant.ofEpochSecond(1448470915), ms[6].unix_timestamp);
        assertEquals( "angus", ms[6].username);
        assertEquals("YES! I'm the head pie eater there...", ms[6].message);
    }

Без этих изменений приложение выводит вопрос пользователю: «хотите ли вы скрыть userIds из чата?». Но все же застрял здесь, так как я не могу ответить «да» или «нет» на это.

Кто-нибудь получил какие-либо идеи относительно того, почему эти два метода не работают? Или, что еще лучше, есть идеи о том, как я могу выполнить тест с входными ответами по мере необходимости?

...