2014-12-31 166 views
2

我正在使用用Groovy編寫的Spock測試來測試一些Java代碼。我使用JMockit來模擬java代碼中的方法,因爲Spock只處理嘲笑的Groovy類。我遇到了測試之間存在JMockit MockUp的問題。這樣的模擬實例應該只存在於測試中(根據JMockit文檔),但這不起作用,我想這是因爲它沒有使用JMockit測試運行器,而是使用Spock測試運行器。JMockit MockUp堅持Spock測試

這是我面臨的問題的最簡單的例子。我有一個簡單的方法返回一個字符串,我可以用MockUp更改該方法的返回值,但它仍然存在第三個測試,它不會被使用。

的Java類

public class ClassToTest { 
    public String method() { 
     return "original"; 
    } 
} 

斯波克測試

class ClassToTestSpec extends Specification { 
    void "first test"() { 
     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "original" 
    } 

    void "second test"() { 
     setup: 
     new MockUp<ClassToTest>() { 
      @Mock 
      public String method() { 
       return "mocked" 
      } 
     } 

     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "mocked" 
    } 

    void "third test"() { 
     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "original" 
    } 
} 

第三個測試失敗,因爲ClassToTest.method()仍返回字符串 「嘲笑」,而不是 「原始」。使用調試器我已驗證Mocked方法被調用兩次。

問題

有什麼辦法來手動刪除JMockit類MockUp?謝謝。

+0

Spock可以模擬Java和Groovy類。嘲笑被測試的班級是一種氣味,應該小心使用。 –

+0

感謝@PeterNiederwieser的迴應,我無法使用正常表示法'instance.method()>> result',你能指出我的方向嗎? – mnd

+0

臨時表示符號工作,我忘了用'Mock'實例化對象,比如'ClassToTest instance = Mock(ClassToTest)'。現在要弄清楚如何使這個部分模擬,可能與間諜。 – mnd

回答

2

您可以在創建的模型對象上調用MockUp.tearDown方法手動撤消其效果。

+0

太棒了!謝謝@Rogerio! – mnd

+0

我個人在spock測試中沒有使用tearDown方法。如果有人已經得到這個工作,我希望看到一個示例規範。謝謝。至於現在,我正在避免Jockey。 – keaplogik

1

不完全是問題的答案 - 因爲我仍然不知道JMockit的MockUp是否可以手動刪除。但是,由於@ PeterNiederwieser的評論,我發現你實際上可以爲Java類創建一個部分模擬。以下是對上面第二個測試的更改。

void "second test"() { 
    setup: 
    ClassToTest test = Spy(ClassToTest) { 
     method() >> "mocked" 
    } 

    when: 
    String result = test.method() 

    then: 
    result == "mocked" 
} 

彼得提到反思的方式和內容進行測試,如果Spy()是必要的,但對我的使用情況下,這是首選。