2013-11-19 5 views
0

Предположим, у меня есть класс DataProvider который реализует IDataProvider Интерфейс. IDataProvider определяет метод IData GetData(). Кроме того, существует класс Потребитель, который должен вызывать эту функцию каждые 5 секунд для обновления. Вот небольшой пример кода, который описывает приведенное выше определение:Stub возвращает stub - плохая практика?

interface IDataProvider{ 
    IData GetData(); 
} 

class Consumer{ 
    IDataPRovider m_provider; 
    Consumer(IDataProvider provider){ 
    m_provider = provider; 
    } 
} 

Теперь, чтобы проверить класс потребителей в полной изоляции я должен создать два корешки. Более точный, DataProviderStub который возвращает DataStub. Как я понял из this тема, заглушка, которая возвращает заглушку, является возможной проблемой с дизайном.

1. Почему именно это проблема? Какие проблемы могут возникнуть?
2. Как я могу переделать его, чтобы избежать заглушки, которая возвращает заглушку, но все еще придерживаться принципов DI и имеет некоторый уровень абстракции?

ответ

0

Штук не такой же, как у нас. Вам не нужно специально учитывать каждый бит поведения заглушки. Поэтому на самом деле не проблема - вам не нужно писать dataProviderMock.GetData.andReturn(mockData), а также за макет IData за каждый раз, когда вызывается GetData, и вам не нужно его достать в нужном порядке.

(Если данные просто POJO/Bean, я рекомендовал бы возвращенное реальный объект, а не огрызок.)

+0

А что, если это не POJO? Если я верну фактический объект, я заблокирую абстракцию, и мой модульный тест будет зависеть от фактической реализации IData. Что тоже не хорошо ... – meltedspark

+0

@binyan уверен, если это не POJO, вы должны, вероятно, заглушить его – artbristol

+0

Что возвращает нас к вопросам выше :) – meltedspark