2015-05-04 7 views
0

Я новичок в модульном тестировании в Scala, и я не могу найти способ заглушить функцию, определенную в одноэлементном объекте.Scala unit testing - stubbing a singleton

Например:

class Profile { 
    def getLatest 
    ... 
    Feed.getLatestEntries 
    ... 
} 

object Feed { 
    def getLatestEntries: Future[List[FeedEntry]] { /* Access some API*/ } 
} 

Я пытаюсь модульного тестирования функции getLatest, определенного в классе профиля. Поскольку я не хочу получать доступ к внешнему API через веб-интерфейс в своих модульных тестах, я пытаюсь заглушить объект Feed и его функцию getLatestEntries для возврата некоторого предопределенного значения.

Я просмотрел рамки ScalaMock, EasyMock и Mockito, но не смог найти способ заглушить метод одноэлементного объекта. ScalaMock утверждает, что

Почему все издевательские рамки не предлагают эту функцию? Как я могу это сделать? заглушка Feed.getLatestEntries?

Благодаря

ответ

3

Мой подход был создать логику синглтона как признак и тогда объект расширить черты. Это позволяет мне предоставить Singleton в качестве аргумента по умолчанию или неявного аргумента, но предоставить исчерпывающую реализацию для тестирования

trait FeedLogic { 
    def getLatestEntries: Future[List[FeedEntry]] { /* Access some API*/ } 
} 

object Feed extends FeedLogic 

def somethingWantingFeed(...)(feed: FeeLogic = Feed) = { ??? } 
+1

Достаточно честный. Но извлечение функций объекта в черты только для того, чтобы сделать их незаменимыми, кажется мне взломанным - я не думаю, что техническая проблема тестирования должна повлиять на мой дизайн кода. Есть ли другое оправдание для извлечения всех функций объекта в черты? – Dani

+1

Я предполагаю, что мой аргумент counter будет состоять в том, что объект singleton, который скрывает какое-то неконфигурируемое состояние или зависимость, что делает его неустойчивым функциональным способом, сам по себе является дизайнерским запахом. Код должен быть поддающимся проверке без издевательства над гимнастикой каркаса, причем эти возможности удобны для тестирования сценариев, не являющихся их участниками. –

+0

Я вижу вашу точку зрения, я принимаю ваш ответ и даю +1 за композицию. Я много читал о шаблоне пирога, как это связано? – Dani