2013-09-10 2 views
4

У меня вопрос о том, как лучше всего решить JUnit-тестирование класса верхнего уровня. Представьте, что у меня есть класс SomeWriter, который имеет метод, который переформатирует String и записывает его в поток. Метод фактически не выполняет эту работу, а вместо этого делегирует ее объекту-члену, который фактически выполняет настоящую работу. Я обобщил это в следующем классе.Каков наилучший способ модульных тестовых классов, которые делегируют работу другим?

public class SomeWriter { 
public void writeReformattedDataToStream(OutputStream outStream, String message) { 
     myReformatter.DoTheActualWorkAndWriteDataToStream(outStream, message); 
} 
} 

Теперь в этом гипотетическом примере, я уже написал свои модульные тесты для класса myReformatter и я показал, что myReformatter работает. Мой вопрос в том, как я должен решить модульное тестирование writeReformattedDataToStream в SomeWriter?

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

Суть в том, должен ли мой тест writeReformattedDataToStream эффективно повторить тест myReformatter или высмеять myReformatter и просто проверить, правильно ли он называется?

Я оценил это похоже на JUnit Test - Class invokes methods in other class

ответ

4

Immediate делегации, как это обычно подпадает под заголовком «слишком просто, чтобы проверить», но если у вас есть абсолютное требование к ней, то вам нужно дразнить ваш OutputStream (используя EasyMock или аналогичный инструмент) и myReformatter и убедитесь, что делегат вызывает соответствующий метод.

+0

Почему он должен издеваться над OutputStream? –

+1

Если он собирается протестировать этот метод, он должен убедиться, что он передает 'outStream' на делегата и не заменяет его каким-либо другим' OutputStream'; прохождение в макете - это самый простой способ, который я знаю, чтобы подтвердить, что 'write' вызывается на том же самом объекте. – chrylis

+1

Спасибо. Интересно, что кажется, что это слишком просто для тестирования. Я пробовал подход TDD к дизайну, поэтому я закончил с большим количеством тестов для методов, которые я обычно не беспокоил. Теперь я получаю ужасное чувство, что кто-то скажет мне, что если я сначала напишу тест, я бы не знал об этом. – steveb

2

Попробуйте инъекции. В целях тестирования вы можете ввести собственную реализацию класса myReformater, который просто проверяет правильность вызова метода и возвращает его. Затем вы тестируете свой тестовый класс отдельно.

3

Как говорит хрилис, вы не должны проверять этот метод.

На самом деле нет ничего, чтобы проверить.

Если вы пишете тестовый пример, который проверяет, что делегат/услуга вызывается, ваш тест связан с реализацией тестируемого метода.

Таким образом, любое изменение в реализации метода потребует изменения теста; и я уверен, что вы этого не хотите.

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