2016-12-12 8 views
1

У меня есть объект, как это:Скала: Moking мой SCALA объект, который имеет внешнюю зависимость

// I want to test this Object 
object MyObject { 

    protected val retryHandler: HttpRequestRetryHandler = new HttpRequestRetryHandler { 
    def retryRequest(exception: IOException, executionCount: Int, context: HttpContext): Boolean = { 
     true // implementation 
    } 
    } 

    private val connectionManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager 
    val httpClient: CloseableHttpClient = HttpClients.custom 
    .setConnectionManager(connectionManager) 
    .setRetryHandler(retryHandler) 
    .build 

    def methodPost = { 
    //create new context and new Post instance 
    val post = new HttpPost("url") 
    val res = httpClient.execute(post, HttpClientContext.create) 
    // check response code and then take action based on response code 
    } 

    def methodPut = { 
    // same as methodPost except use HttpPut instead HttpPost 
    } 

} 

Я хочу, чтобы проверить этот объект, насмехаясь зависимые объекты, как HTTPClient. Как достичь этого? могу ли я сделать это с помощью Mokito или любым лучшим способом? Если да. Как? Есть ли лучший дизайн для этого класса?

ответ

0

Ваша проблема: вы создали труднопробный код. Вы можете повернуть here, чтобы посмотреть видео, чтобы понять, почему это так.

Короткий ответ: прямой вызов нового в вашем производственном коде всегда усложняет тестирование. Вы могли бы использовать шпионов Mockito (см. here о том, как это работает).

Но: лучшим ответом будет переделка вашего производственного кода; например, для использования инъекции зависимостей. Значение: вместо создания объектов, которые вам нужен сам класс (используя новый) ... ваш класс получает те объекты откуда-то.

Типичный (Java) подход был бы что-то вроде:

public MyClass() { this (new SomethingINeed()); } 

MyClass(SomethingINeed incoming) { this.somethign = incoming; } 

Других слов: нормальный путь использования до сих пор называет нового напрямую; но для модульного тестирования вы предоставляете альтернативный конструктор, который вы можете использовать для ввода . вещь, на которую зависит ваш класс.

+0

Я думал об инъекции зависимостей, но не мог понять, как реализовать. Один из подходов, который я использовал, заключался в том, чтобы использовать httpClient в качестве параметра для каждого метода (поскольку класс объектов не может иметь конструктор в Scala, например Java .. но все же Put and Post будет иметь новый), но в этом случае я потеряю контроль над повторением и другим сбоем обработка дела. –

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

  • Нет связанных вопросов^_^