2016-12-12 41 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那樣在Scala中具有構造函數,但Put和Post將會有新的),但是在這種情況下,我將失去對重試和其他失敗的控制案件處理。 –