2014-11-25 3 views
3

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

public class MyClass { 
    protected String processIncominData(String input) { 
    String request = ...; 
    ... 
    String response = forwardRequest(request); 
    ... 
    return response; 
    } 

    public String forwardRequest(String requestToSocket) { 
    String hostname = socketServerName; 
    int port = socketServerPort; 
    String responseLine=null; 
    Socket clientSocket = null; 
    PrintStream outs=null; 

    BufferedReader is = null; 
    BufferedWriter bwriter=null; 

    try { 
     clientSocket = new Socket(hostname, port); 
     outs=new PrintStream(clientSocket.getOutputStream()); 
     is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     bwriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 

    } catch (UnknownHostException e) { 
     LOGGER.error("Don't know about host: " + hostname + e.getMessage()); 
    } catch (IOException e) { 
     LOGGER.error("Couldn't get I/O for the connection to: " + hostname + e.getMessage()); 
    } 

    if (clientSocket == null || outs == null || is == null) { 
     LOGGER.error("Something is wrong. One variable is null."); 
    } 
    try { 
     while (true) { 
      StringBuilder sb = new StringBuilder(); 
      sb.append(requestToSocket); 

      String request = sb.toString().trim(); 
      bwriter.write(request); 
      bwriter.write("\r\n"); 
      bwriter.flush(); 
      responseLine = is.readLine(); 
      LOGGER.info("Socket returns : " + responseLine); 
      //outs.println(responseLine); 
      bwriter.close(); 
     } 
    } catch (UnknownHostException e) { 
     LOGGER.error("Trying to connect to unknown host: "+ e.getMessage()); 
    } catch (IOException e) { 
     LOGGER.error("IOException: "+ e.getMessage()); 
    } 
    finally{ 
     try { 
      outs.close(); 
      is.close(); 
      clientSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
    return responseLine; 
    } 
} 

Я хочу, чтобы дразнить ответ XML здесь, чтобы проверить processIncomingData method..This ответ приходит от сервера сокета и я посылаю запрос на сокет клиента. Я думаю, что сокет не имеет значения, могу ли я издеваться над xmlResponse из сокета. Пожалуйста, дайте полезный ответ

+0

Показать как 'xmlResponse' генерируется. Вам нужно использовать макет в строке 'String xmlResponse = ...;'. Если это вызов метода экземпляра, используйте 'Mockito', чтобы издеваться над bean-компонентом (читать сокет-клиент). Если это статический вызов, используйте 'JMockit', чтобы издеваться над статическим вызовом. –

+0

Я читаю xml-ответ от сервера сокетов. Он находится в строчном формате, таком как «» и т. Д. – Lakshya

+0

Ваш модульный тест не должен зависеть от сервера сокета. Вы должны насмехаться над клиентом. –

ответ

1

Теперь, когда вы разместили его, ответ на вопрос о том, как его издеваться, здесь.

testing-java-sockets

+0

, но я не использую сокет в моем первом методе? – Lakshya

+0

Спасибо, Джон .. Я высмеял поток ввода и его работу сейчас ... – Lakshya

0

Вы можете попробовать spy метод.

MyCalss my = spy(new MyCalss()); 
when(my.forwardRequest("foo")).thenReturn("bar"); 

тогда, когда вы звоните

my.processIncominData("baz"); 

ответ будет «бар» (если запрос «Foo»)

PS: Если вам нужно издеваться класс тестируемой он показывает некоторые проблемы с вами дизайн.

+3

Но лучше реорганизовать это, чтобы иметь тысячи методов в разных классах. – talex

+3

Обычно считается плохой практикой, чтобы издеваться над тестируемым классом. –

+0

@JohnB Да. Это wy, я добавил комментарий к отдельному классу. – talex

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