Я пытался написать тесты для моей программы, которая содержит несколько записей командной строки пользователем. Я пытался использовать совет, найденный здесь ( 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 из чата?». Но все же застрял здесь, так как я не могу ответить «да» или «нет» на это.
Кто-нибудь получил какие-либо идеи относительно того, почему эти два метода не работают? Или, что еще лучше, есть идеи о том, как я могу выполнить тест с входными ответами по мере необходимости?