2013-05-21 13 views
16

使用Mockito's examples page中最基本的示例,我能夠在JUnit中成功運行。Simple Mockito驗證在JUnit中有效,但不是Spock

但是,當我在Spock中運行相同的測試時,它失敗。

的JUnit/Java版本(這通過):

import org.junit.Test; 

import java.util.List; 

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.verify; 

public class SimpleJunitTest 
{ 
    @Test 
    public void basicMockTest() 
    { 
     List mockedList = mock(List.class); 

     //using mock object 
     mockedList.add("one"); 
     mockedList.clear(); 

     //verification 
     verify(mockedList).add("one"); 
     verify(mockedList).clear(); 
    } 
} 

斯波克/ Groovy的版本(失敗):

import static org.mockito.Mockito.mock 
import static org.mockito.Mockito.verify 


class SimpleSpockTest extends spock.lang.Specification 
{ 
    def "Basic Mock Test"() 
    { 
     given: 
      //mock creation 
      List mockedList = mock(List.class); 

     when: 
      //using mock object 
      mockedList.add("one"); 
      mockedList.clear(); 

     then: 
      //verification 
      verify(mockedList).add("one"); 
      verify(mockedList).clear(); 
    } 

} 

以下是錯誤我得到當斯波克測試失敗:

Condition not satisfied: 

verify(mockedList).add("one") 
|  |   | 
|  |   false 
|  [email protected] (renderer threw  
NullPointerException) 
[email protected] (renderer threw 
NullPointerException) 

at SimpleSpockTest.Basic Mock Test(SimpleSpockTest.groovy:25) 

任何想法或建議嗎?我非常喜歡Spock和Mockito,並希望讓他們一起工作。非常感謝你!

回答

17

粗略地說,then-block可能只包含布爾表達式形式的斷言。 Mockito驗證表達式不適合此合約,因爲它會在傳遞時返回一個虛假值(null,false,0),Spock將其解釋爲失敗的斷言。

要解決此問題,您可以編寫一個包裝驗證表達式的輔助方法,並始終返回true,或者您可以使用Spock的內置模擬框架而不是Mockito。

+0

得說,試圖避免它,但Spoke的模擬驗證錯誤信息是相當驚人的真棒。 –

+0

謝謝。偉大的錯誤消息當然是Mockito的商標。幸運的是,我經常從Szczepan(Mockito的創建者)那裏獲得有關如何改進Spock錯誤消息的反饋,並且大部分時間我都在聽他說的話。 :-) –

+8

因爲我需要模擬一些Spring組件,並且仍然無法使用Spock模擬來做這件事,而且我發現'Mockito.verify(mock)「,所以我回過頭來看了一會兒。 foo(bar)|| true'對我來說工作得很好,而且是合理可讀的。 – chrylis