2014-10-09 2 views
-1

У меня есть приложение с классом, зарегистрированным как прослушиватель сообщений, который получает сообщения из очереди, проверяет его на правильный тип класса (в public void onMessage(Message message)) и отправляет его другому классу, который преобразует этот класс в строку и записывает строку в файл журнала (в public void handleMessage(MessageType m)). Как бы вы написали для этого единичные тесты?Как написать модульные тесты для этого простого приложения

+0

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

+0

Интеграционный тест тоже? Вы используете maven? –

+0

Чтобы избежать дублирования ответов, вы можете ** [см. Мой ответ здесь] (http://stackoverflow.com/questions/26228523/should-unit-tests-ensure-a-specific-method-was-called-to -приход-на-результат/26232511 # 26232511) ** примерно подобный вопрос. – ekostadinov

ответ

0

Если вы можете использовать Mockito в сочетании с JUnit ваш тест может выглядеть следующим образом:

public void onMessage_Success() throws Excepton { 
    // Arrange 
    Message message = aMessage().withContent("...").create(); 
    File mockLogFile = mock(File.class); 
    MessageHandler mockMessageHandler = mock(MessageHandler.class); 
    when(mockMessageHandler).handleMessage(any(MessageType.class) 
     .thenReturn("somePredefinedTestOutput"); 
    when(mockMessageHandler).getLogFile().thenReturn(mockLogFile); 

    MessageListener sut = spy(new MessageListener()); 
    Whitebox.setInternalState(sut, "messageHanlder", mockMessageHandler); 
    // or simply sut.setMessageHandler(mockMessageHandler); if a setter exists 

    // Act 
    sut.onMessage(message); 

    // Assert 
    assertThat(mockLogFile, contains("your desired content")); 
    verify(sut, times(1)).handleMessage(any(Message.class)); 
} 

Обратите внимание, что это всего лишь простой пример того, как вы могли бы проверить это. Вероятно, есть много других способов протестировать функциональность. В приведенном выше примере showcaeses типичный шаблон-строитель для генерации сообщений по умолчанию, которые принимают определенные значения для тестирования. Более того, я действительно не уточнил совпадение Hamcrest для метода contains на mockLogFile.

Как @Keppil также отметил в своем комментарии, имеет смысл создать несколько тестов-случаи, которые слегка varry в аранжировать и утверждающие части, где плохих футляры тестируемых


То, что я, вероятно, Жду» t достаточно объясняет, что метод getLogFile() (который с высокой степенью уверенности имеет другое имя в вашем приложении) MessageHandler должен возвращать ссылку на файл, используемый вашим экземпляром MessageHandler, для хранения фактических сообщений журнала. Поэтому, вероятно, лучше определить этот mockMessageHandler как spy(new MessageHandler()) вместо mock(MessageHandler.class), хотя это означает, что единичный тест на самом деле является тестом интеграции, поскольку взаимодействие двух классов проверяется одновременно.

Но в целом я надеюсь, что у вас есть идея - использовать mock (Class) для генерации реализаций по умолчанию для зависимостей, требуемых вашим системным подтестом (SUT) или шпиона (экземпляр), если вы хотите включить объект реального мира вместо одного, который имеет только нулевые значения в качестве возвращаемых типов. Вы можете влиять на возвращаемое значение издевающихся объектов с помощью (...). ThenReturn (...) /. ThenThrow (...) или doReturn (...). Когда (...) в случае пустотных операций fe

Если у вас есть инъекция зависимостей в закрытых полях, вы должны использовать Whitebox.setInternalState(...) для ввода значений в классы sut или mock, если нет общедоступных или закрытых пакетов (если вы получаете тестовую модель повторного использования структуры пакета классы системы под тестом в ваших тестовых классах).

Кроме того, verify(...) позволяет вам убедиться, что при выполнении SUT был вызван определенный метод. Это весьма удобно в этом сценарии, когда фактическое утверждение не является тривиальным.