2014-02-02 2 views
0

У меня есть метод, печать победителем в классе игры:Как проверить метод, который только распечатать сообщение

public void getWinner(String winner){ 

    System.out.println("WINNER IS " + winner); 

} 

Как я могу проверить этот метод до сих пор у меня есть:

Game gm = new Game(); // it is declared in @before 

@test 

public void test(){ 

    ByteArrayOutputStream outContent = new ByteArrayOutputSystea(); 

    System.setOut(new PrintStream(outContent)); 

    gm.getWinner(Bob); 

    assertEquals("WINNER IS Bob",outContent.toString()); 

} 

У меня есть сообщение об ошибке, что сказать

org.unit.ComparisonFailuter expected:<WINNER IS Bob[]> but was: <WINNER IS Bob[ 
]> 

Ну могли бы вы дать мне совет о том, как проверить метод getWinner

+5

'println' добавляет новый символ строки. –

+0

Вам нужно показать больше кода .. Что такое 'Bob'? Кроме того, исправьте опечатки в коде. –

+2

Обратите внимание также, что 'ByteArrayOutputStream # toString()' устарел. –

ответ

0

От documentation:

public void println(String x) 

Prints a String and then terminate the line. This method behaves as though it invokes print(String) and then println(). 

Итак, когда вы печатаете строки в методе, есть разделитель строки после него, который defined, как так:

The line separator string is defined by the system property line.separator, and is not necessarily a single newline character ('\n').

Таким образом, вы можете добавить жесткий разделитель строк к вашему ожидаемому результату или вы можете использовать следующий код для получения разделителя для текущей системы и добавить его .:

System.getProperty("line.separator"); 
-2

Я думаю, вы пытаетесь сравнить со строками с ==, когда вы должны использовать .equals(). Строки хранятся в постоянном пуле, но в этом случае вы читаете строку из другого места, которая не переходит в постоянный пул.

Попробуйте

assertTrue(outContent.toString().equals("WINNER IS Bob")); 

или что-то в вашей библиотеке тестирования называет.

, который ищет символы в строке вместо адреса памяти («ref») строки.

+0

assertEquals() делает то, что говорит его имя: он сравнивает свои два аргумента с равными. Использование assert() на самом деле не является хорошим советом. –

+0

Да, но вы не хотите проверять равенство ссылок на строковый объект, но через метод .equals. Учитывая факты в вопросе, это, кажется, ошибка. assert - это правильная вещь, отредактированная! – claj

+0

Перечитайте мой комментарий. assertEquals() использует equals. не ==. И, как уже отмечали комментарии, прежде чем вы даже набрали свой ответ и, как показывает сообщение об ошибке, проблема заключается в символе новой строки, который добавляется println(). Это не имеет ничего общего с == vs. equals. assert() НЕ является правильным инструментом. assert - это низкоуровневый механизм, который обычно отключается. Он не является частью структуры модульного тестирования. –

0

mockist подход:

@Test 
public void testGetWinner() 
    { 
    // setup: sut 
    Game game = new Game(); 
    PrintStream mockPrintStream = EasyMock.createMock(PrintStream.class); 
    System.setOut(mockPrintStream); 

    // setup: data 
    String theWinnerIs = "Bob"; 

    // setup: expectations 
    System.out.println("WINNER IS " + theWinnerIs); 

    // exercise 
    EasyMock.replay(mockPrintStream); 
    game.getWinner(theWinnerIs); 

    // verify 
    EasyMock.verify(mockPrintStream); 
    } 

Pro: Вам не нужно заботиться, что System.out.println() делает, на самом деле, если реализация меняет ваш тест будет еще пройти.

0

omg не делаем! вам не нужно тестировать метод println. ребята из солнца и оракула уже сделали это - вы можете быть уверены, что это работает. все, что вам нужно проверить, - это передать правильную строку этому методу. поэтому отредактируйте свой код и создайте функцию, которая возвращает нужную строку и проверит только этот метод простым сравнением строк.

Смежные вопросы