2012-11-12 46 views
0

我正在嘗試使用spock爲我有的方法編寫測試。spock測試中的對象比較失敗

的方法是這樣的 -

InvoiceView getInvoiceDetailView(String invoiceNumber, Boolean isNew) { 
    InvoiceView detailView; 
    if (isNew) { 
     newInvoiceDao.em = billingEm; 
     //call InvoiceDao 
     List<GroovyRowResult> invoiceSummaryRowResult = billingAdmin.rows(InvoiceQueries.GET_NEW_INVOICE_SUMMARIES_BY_NUMBER, [invoiceNumber:invoiceNumber]); 
     List<GroovyRowResult> invoiceDetailsRowResult = billingAdmin.rows(InvoiceQueries.GET_NEW_INVOICE_DETAILS_BY_NUMBER, [invoiceNumber:invoiceNumber]); 
     InvoiceModel invoiceModel = newInvoiceDao.getInvoice(invoiceNumber); 
     detailView = new InvoiceView(invoice:invoiceModel, 
              summary:invoiceSummaryRowResult, 
              details:invoiceDetailsRowResult); 
} ... 

我的測試只是想斷言,當調用此方法與真正的傳遞作爲是否新款參數的值,則返回一個有效InvoiceView對象。

在我的斯波克測試中,我創建了一些對象,我期望能夠從方法返回:

def expectedInvoiceModel = new InvoiceModel() 
def expectedInvoiceSummaryRowResult = new ArrayList<GroovyRowResult>() 
def expectedInvoiceDetailsRowResult = new ArrayList<GroovyRowResult>() 

def expectedInvoiceView = new InvoiceView(invoice:expectedInvoiceModel, 
              summary:expectedInvoiceSummaryRowResult, 
              details:expectedInvoiceDetailsRowResult) 

我還嘲笑我會被調用到DAO對象:

def setup() { 
    ... 
    service.billingAdmin = Mock(Sql) 
    ... 
} 

所以最後到Spock夾具上。我將違規的比較行註釋掉了,並且有一個解決方法。我的問題是 - 爲什麼我的「then」塊中的第一行失敗?

def "getInvoiceDetailView returns valid InvoiceView for new invoice"() { 
    given: 
     service.billingAdmin.rows(InvoiceQueries.GET_NEW_INVOICE_SUMMARIES_BY_NUMBER, [invoiceNumber:invoiceNumber]) >> expectedInvoiceSummaryRowResult 
     service.billingAdmin.rows(InvoiceQueries.GET_NEW_INVOICE_DETAILS_BY_NUMBER, [invoiceNumber:invoiceNumber]) >> expectedInvoiceDetailsRowResult 
     service.newInvoiceDao.getInvoice(_) >> expectedInvoiceModel 

    when: 
     def result = service.getInvoiceDetailView(invoiceNumber, true) 
    then: 
     //result == expectedInvoiceView -- Why doesn't this work? 
     result.invoice == expectedInvoiceModel 
     result.summary == expectedInvoiceSummaryRowResult 
     result.details == expectedInvoiceDetailsRowResult 
} 

回答

1

顯然,物體是不相等的按InvoiceView類的equals方法。或者,也許該班級沒有聲明equals方法,並且對象不相同(根據Object.equals)。

+0

這是我想通問題是。我在類定義之上插入了規範的常規註釋,但這並沒有幫助,比較檢查仍然失敗。不知道如何解決這個問題... –

+0

只需在調試器中運行測試。 –

0

Zachary。

您沒有正確模擬getInvoice方法。雖然你調用它傳遞兩個參數,但你的模擬調用只需要一個參數(「_」字符接受任何參數,但只能匹配一個參數)。由於沒有匹配的模擬方法,因此對getInvoice的調用將返回默認值null,從而使測試失敗。

你應該做到以下幾點,讓您的測試通過:

service.newInvoiceDao.getInvoice(_, _) >> expectedInvoiceModel 

我已經寫了一個小測試,以使更多的清晰。考慮下面的類:

private static class StringUtils { 
    public String concatenate(String a, String b) { 
     return a + b; 
    } 
} 

下面的測試將會失敗:

def "concatenation should work!"() { 
    given: 
    StringUtils su = Mock() 
    su.concatenate(_) >> "ab" 

    when: 
    def result = su.concatenate("a", "b") 

    then: 
    result == "ab" 
} 

請注意,我模擬的方法,預計只有一個參數:

su.concatenate(_) >> "ab" 

這是顯示錯誤消息我得到一個空值:

Condition not satisfied: 

result == "ab" 
|  | 
null false 

不過,如果我嘲笑串連方法正確,測試將成功:

su.concatenate(_, _) >> "ab" 
+0

感謝您的答覆卡洛斯,但我不認爲這是解決方案。我不知道爲什麼把這個陳述移到當時的區塊會有所作爲,但我給了它一個鏡頭,沒有骰子。 –

+0

對不起,我認爲它與Spock mock範圍的混亂定義有關。 – carlos

+0

這是不凌亂。 :-) –